首页 > 编程知识 正文

java线程有哪几种状态,java多线程状态

时间:2023-05-03 11:47:00 阅读:200865 作者:2639

java多线程中线程的6种状态以及4种实现的理解 java线程的生命周期

java线程的状态有6

Thread类内部有枚举类State详细描述了线程的6种状态:

1.初始(NEW):新创建了一个线程对象,但是还没有调用start()方法。
2. 运行(RUNNABLE):Java线程中将就绪(ready)和运行中(running)两种状态笼统的成为“运行”。
线程对象创建后,其他线程(比如main线程)调用了该对象的start()方法。该状态的线程位于可运行线程池中,等待被线程调度选中,获取cpu 的使用权,此时处于就绪状态(ready)。就绪状态的线程在获得cpu 时间片后变为运行中状态(running)。

3.阻塞(BLOCKED):表线程阻塞于锁。

4.等待(WAITING):进入该状态的线程需要等待其他线程做出一些特定动作(通知或中断)。

5.超时等待(TIME_WAITING):该状态不同于WAITING,它可以在指定的时间内自行返回。

6.终止(TERMINATED):表示该线程已经执行完毕。

实现多线程的四种方法

继承java.lang.Thread 类
继承Thread类,重写run方法(Thread类已经实现了runnable接口)
runable中只有run()一个方法。

例子:

public class myThread extends Thread{@Overridepublic void run(){System.out.println("我被调用了");}public stataic void main(String[] args){new myThread().start();}} 实现Runnable 接口

比起继承Thread类,类是单继承的,而接口是多继承的,很不方便,所以我们可以自己写一个实现了Runnable接口的类。
在使用时,通过Thread的构造函数来构造Thread对象后使用。

例:

public class myThread implements runnable{@Overridepublic void run(){}public static void main(String[] args){Thread mythread= new Thread(new myThread);mythread.run();}} 实现Callable 接口

在继承Thread和实现Runnable时是无法返回值和抛出异常的。
我们利用FutureTask类的构造函数,传入实现了callable接口的对象(实现call()函数,该函数有返回值),
再利用Thread的构造函数,传入实现了Runnable接口的FutureTask对象,最终通过Thread的start()函数来调用
我们通过使用FutureTask类来实现返回值(实现了get函数)
同时实现了Runnable接口,最终传入Thread的构造函数。


例:

class MyThread2 implements Callable<String> { @Override public String call() throws Exception { for ( int x = 0 ; x < 10 ; x ++ ) { System.out.println("******线程执行,x = " + x); } return "线程执行完毕!"; }}public class demo { public static void main(String[] args) throws Exception{ // FutureTask类中重写了run()方法,里面带有set()函数 FutureTask futureTask = new FutureTask(new MyThread2()); // 通过传入Thread的构造函数来实现 new Thread(futureTask).start(); //通过get()来获得返回值 System.out.println("线程返回值:" + futureTask.get()); }} 通过线程池创建

(底层还是使用了callable,和runnable)
Executor是顶级接口但不是一个线程池,是工具,
ExecutorService是线程池。

import java.util.concurrent.ExecutorService;import java.util.concurrent.Executors;public class ExecutorDemo implements Runnable { private static int task_num = 2; //任务数量 @Override public void run() { int t = 1; for (int i = 0; i < 10; i++) { System.out.println(Thread.currentThread().getName() + " " + (t++)); } } public static void main(String[] args) { ExecutorService executorService = Executors.newFixedThreadPool(3); for (int i = 0; i <task_num; i++) { ExecutorDemo ed = new ExecutorDemo(); executorService.execute(ed); } executorService.shutdown(); }} 注意事项

在java底层中唯一实现多线程的方法即被系统调用start()方法
注:一般此方法是一个本地方法(native),会在合适的时候调用run()方法

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。