线程是操作系统能够进行运算调度的最小单位,它被包含在进程之中,是进程的实际运作单位
在多核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<String> {
@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<String> 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的调度器来决定哪个线程将会运行。
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中创建多线程的三种常见方法:继承Thread类、实现Runnable接口和实现Callable接口。同时,深入探讨了线程的六种状态:NEW、RUNNABLE、BLOCKED、WAITING、TIME_WAITING和TERMINATED,以及它们之间的转换。
2787

被折叠的 条评论
为什么被折叠?



