线程是操作系统能够进行运算调度的最小单位,它被包含在进程之中,是进程的实际运作单位
在多核CPU横行的今天,使用多线程来进行任务处理,可以更好的利用计算机资源。
java中创建一个线程常用的有如下三种方式:
public class ThreadDemo extends Thread { public void run(){ System.out.println(Thread.currentThread().getName()); } public static void main(String[] args) { ThreadDemo threadDemo = new ThreadDemo();//NEW 状态 threadDemo.start(); } }
继承Thread类,重写run方法。
public class RunnableDemo implements Runnable{ @Override public void run() { System.out.println(Thread.currentThread().getName()); } public static void main(String[] args) { Thread thread = new Thread(new RunnableDemo()); //NEW thread.start(); //RUNNABLE } }
实现runnable接口,重写run方法,创建线程使用Thread来包装
public class CallableDemo implements Callable{ @Override public String call() throws Exception { System.out.println(Thread.currentThread().getName()); return "Hello CallAble"; } public static void main(String[] args) throws ExecutionException, InterruptedException { ExecutorService executorService = Executors.newFixedThreadPool(1); Future future = executorService.submit(new CallableDemo()); System.out.println(future.get()); } }
通过实现Callable接口的方式创建的线程,可以获取线程操作结束的返回值。
实现Callable接口,重写call方法。实现Callable接口时需要明确泛型参数,这个参数的类型就是返回值的类型。
创建时先通过ExecutorService executorService = Executors.newFixedThreadPool(1);来获取ExecutorService对象;
再调用ExecutorService对象的submit对象,将实现了Callable接口的线程操作对象传入。
用Future对象来接收线程操作的返回值。
因此,我们在工作中就可以根据自己的需求来选择创建线程的方式。
java中给线程定义了六个状态:
分别是NEW、RUNNABLE、BLOCKED、WAITING、TIME_WAITING、TERMINATED.
借用 《Java 并发编程的艺术》图一张
当调用一个线程类的new方法,创建一个对象时
ThreadDemo threadDemo = new ThreadDemo();
这个线程就处于NEW的状态。
threadDemo.start();
调用start()方法时。这个对象就处于RUNNABLE状态。注意,这时候,线程不会立刻工作,他需要等待OS的调度器来决定哪个线程将会运行。
一个运行中的线程调用Object.wait()、Object.join()方法、LockSupport.park()方法将会进入WAITING状态。
一个WAITING中状态可以通过Object.notiyf()、Object.notiyfAll()、LockSupport.unpark(Thread)方法回到可运行状态;还是需要等待调度器分配时间片
运行中的线程通过Thread.sleep(long)、Object.wait(long)、Object.join(long)、LockSupport.parkNanos()、LockSupport.parkUtil()方法可进入TIME_WAITING.状态
TIME_WAITING状态的线程也可Object.notiyf()、Object.notiyfAll()、LockSupport.unpark(Thread)、时间到期四种方式返回到RUNNABLE状态,等待OS调度器分配时间片
当运行中的线程遇到synchronized锁住的对象是 ,取不到锁进入BLOCKED阻塞状态。
等线程可以取到锁是,从阻塞返回运行状态
等线程全部执行完毕时,进入停止状态。