Contents
  1. 1. 什么是线程?
  2. 2. 什么是进程?
  3. 3. 什么是多线程
  4. 4. 进程和线程之间的区别
  5. 5. 线程的五种状态?—生命周期
  6. 6. 为什么要用多线程?
  7. 7. 实现多线程的方式
  8. 8. 线程的创建,停止,常用方法介绍:
  9. 9. 什么是线程安全
  10. 10. 守护线程:
  11. 11. Start()和run()方法

什么是线程?

是进程中的一个实体,是被系统独立调度和分派的基本单位,线程自己不拥有系统资源,只拥有一点在运行中必不可少的资源,但它可与同属一个进程的其它线程共享进程所拥有的全部资源。一个线程可以创建和撤消另一个线程,同一进程中的多个线程之间可以并发执行。线程有就绪、阻塞和运行三种基本状态。

什么是进程?

进程是计算机中的程序关于某个数据集合的一次活动,是系统进行资源分配和调度的基本单位,是操作系统结构的基础。一个可以独立运行的程序单位。是线程的集合。

什么是多线程

同一个进程中有多个线程在并发执行。进程的多个执行路径。

进程和线程之间的区别

线程是进程的最小运行单位,进程是线程的集合。一个进程由一个或多个线程组成。

线程的五种状态?—生命周期

创建(new) 就绪(runnable) 运行(running) 阻塞(blocked) 死亡(dead)

img

为什么要用多线程?

单进程会出现阻塞,这时整个进程就会挂掉,直到外部条件发生变化。

1.异步调用: 读写分离,IO操作等。如果是单线程,那么程序就必须等待这些操作执行完成之后才能执行其他的操作。使用多线程,可以将耗时任务放在后台继续执行的同时,执行其他任务。

2.可以提高程序效率。

缺点:

1.多线程消耗系统资源,因为线程需要开辟内存。多线程就需要更多的线程。

2.需要考虑线程操作对程序的影响,如线程挂起,中止等。

3.线程使用不当会发生很多问题。

多线程是异步的,但不代表多线程真的是几个线程是在同时进行,实际上是系统不断地在各个线程之间切换(由于切换速度很快,所以给我们在同时运行的错觉)

实现多线程的方式

1.继承Thread()类,重写run()方法

Thread()类本质上是实现了Runnable接口的一个实例,代表一个线程实例。启动线程的唯一方法就是通过Thread()类的start()方法。start是一个native方法,它将启动一个线程,并执行run()方法。这种实现多线程很简单,通过自己的类extends Thread,并复写run()方法,就可以启动并执行自己定义的run()方法。例如:

1
2
3
4
5
6
7
8
9
10
public class MyThread extends Thread {  
  public void run() {
   System.out.println("MyThread.run()");
  }
}

MyThread myThread1 = new MyThread();
MyThread myThread2 = new MyThread();
myThread1.start();
myThread2.start();

start()方法本质是将线程进入就绪状态,等待cpu执行run()方法,如果直接调用thread.run方法,那么就和普通的方法没有区别,不是异步操作。

2.实现Runnable接口创建线程

如果自己的类已经继承其他的类,就可以实现Runnable接口,java不支持多继承。

1
2
3
4
5
6
7
8
class MyRunable extends Runnable {  
  public void run() {
   System.out.println("Runnable.run()");
  }
}
//启动实现runnable接口创建的线程对象
Thread myThread1 = new Thread(new MyRunable());
myThread1.start();

Runable 避免了java单继承的局限性;更加符合面向对象,线程分为两部分,一部分线程对象,一部分线程任务。

Runable只是任务,只是定义了线程要执行的任务,Thread才是真正的线程创建者,也就是说线程和任务是分开的,任务放在放在线程里面才会被执行。run()方法是线程的运行者,main只有调用了run()方法才能执行任务。

strat()方法是创建线程。

总结:1.start()是线程的启动者;2.run()是线程运行的执行者。 总结:1.实现Runnable接口的实例是线程任务的定义者;2.继承Thread类的实例是线程的创建者

线程的创建,停止,常用方法介绍:

停止的3种方法:

1.线程正常停止,即run()方法运行结束正常停止。

2.interrupt()方法终止线程。

3.stop()方法暴力终止。

 interrupt方法中断线程介绍:

    interrupt方法其实并不是直接中断线程,只是给线程添加一个中断标志。

  判断线程是否是停止状态:

    this.interrupted(); 判断当前线程是否已经中断。(判断的是这个方法所在的代码对应的线程,而不是调用对象对应的线程)

    this.isInterrupted(); 判断线程是否已经中断。(谁调用,判断谁)

什么是线程安全

当多个线程访问某个类时,这个类始终都能表现出正确的行为,那么就称这个类是线程安全的。

守护线程:

java线程分为两种:

1.用户线程,运行在前台,执行具体的任务

2.守护线程,运行在后台,为前台线程服务(GC)

特点:一旦所有的用户线程都结束运行,守护线程会随着JVM一起结束工作。垃圾回收线程就是一个常见的守护线程。

Start()和run()方法

1.start()方法来启动线程,真正实现了多线程运行。这时无需等待run方法体代码执行完毕,可以直接继续执行下面的代码;通过调用Thread类的start()方法来启动一个线程, 这时此线程是处于就绪状态, 并没有运行。 然后通过此Thread类调用方法run()来完成其运行操作的, 这里方法run()称为线程体,它包含了要执行的这个线程的内容, Run方法运行结束, 此线程终止。然后CPU再调度其它线程。
2.run()方法当作普通方法的方式调用。程序还是要顺序执行,要等待run方法体执行完毕后,才可继续执行下面的代码; 程序中只有主线程——这一个线程, 其程序执行路径还是只有一条, 这样就没有达到写线程的目的。

Contents
  1. 1. 什么是线程?
  2. 2. 什么是进程?
  3. 3. 什么是多线程
  4. 4. 进程和线程之间的区别
  5. 5. 线程的五种状态?—生命周期
  6. 6. 为什么要用多线程?
  7. 7. 实现多线程的方式
  8. 8. 线程的创建,停止,常用方法介绍:
  9. 9. 什么是线程安全
  10. 10. 守护线程:
  11. 11. Start()和run()方法