关于Java的线程

1、线程、进程

进程是资源分配的基本单位,一个进程可以包含多个线程,每条线程执行不同的任务,不同的进程使用不同的内存空间,而所有的线程共享一片相同的内存空间。
线程是进程中执行运算的最小单位,虽然同一进程中的线程共享该进程的所有资源,但是每个线程也有自己独立的栈内存,用来存放本地数据。

2、创建线程的三种方式(实现多线程的四种方式)

(1)继承Thread类,重写run()方法
(2)实现Runnable接口,重写run()方法,【 实现Runnable接口的实现类的实例对象作为Thread的构造器的参数来创建线程,如:Thread thread = new Thread( new RunnableDemo() ) ; 】
(3)实现Callable接口,重写call方法,并使用FutureTask创建线程和获取返回值,而且callable还可以抛出异常。

	FutureTask<Integer> ft = new FutureTask<>(new MyTask());		//使用FutureTask运行线程并获得返回值
	Thread t = new Thread(ft);
	t.start();
	//自己获取返回值
	System.out.println(ft.get());

(4)通过线程池来创建线程

3、线程的生命周期

关于Java的线程

线程的一生会经历5个状态

  1. 新建:使用new关键字创建了一个线程。
  2. 就绪:调用start()方法之后,线程处于就绪状态,不一定立即运行,要等待资源调度运行
  3. 运行:就绪状态的线程获得CPU资源后,执行run方法
  4. 阻塞:当前线程失去所占的资源,暂停运行,进入阻塞状态
  5. 死亡:线程执行完毕或被其他线程杀死,线程死亡。

状态之间的转换以及一些方法

  • sleep();:当线程调用sleep(time),线程进入阻塞(休眠)状态,释放所占资源,但是如果有锁的话,sleep方法并不会释放锁。
  • yield();:使当前线程从运行状态转换为就绪状态,只能使同优先级或优先级高的线程有执行机会,所以线程yield之后可能又马上被执行,yield方法也不会释放锁资源。
  • join();:等待一个线程执行完毕之后再执行接下来的线程。