Java巩固之路-----多线程(一)

线程是操作系统能够进行运算调度的最小单位,它被包含在进程之中,是进程的实际运作单位

在多核CPU横行的今天,使用多线程来进行任务处理,可以更好的利用计算机资源。

下面说下java中如何使用多线程

java中创建一个线程常用的有如下三种方式:

1、继承Thread

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方法。

2、实现Runnable接口

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来包装

3、实现Callable接口

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 并发编程的艺术》图一张

Java巩固之路-----多线程(一)_第1张图片

当调用一个线程类的new方法,创建一个对象时

 

ThreadDemo threadDemo = new ThreadDemo();

这个线程就处于NEW的状态。

threadDemo.start();

调用start()方法时。这个对象就处于RUNNABLE状态。注意,这时候,线程不会立刻工作,他需要等待OS的调度器来决定哪个线程将会运行。

RUNNABLE<———>WAITING

一个运行中的线程调用Object.wait()、Object.join()方法、LockSupport.park()方法将会进入WAITING状态。

一个WAITING中状态可以通过Object.notiyf()、Object.notiyfAll()、LockSupport.unpark(Thread)方法回到可运行状态;还是需要等待调度器分配时间片

RUNNABLE<———>TIME_WAITING

运行中的线程通过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调度器分配时间片

RUNNABLE<———>BLOCKED

当运行中的线程遇到synchronized锁住的对象是 ,取不到锁进入BLOCKED阻塞状态。

等线程可以取到锁是,从阻塞返回运行状态

TERMINATED

等线程全部执行完毕时,进入停止状态。

 

你可能感兴趣的:(Java,巩固之路)