码迷,mamicode.com
首页 > 编程语言 > 详细

线程的状态以及创建多线程的三种方式

时间:2019-10-07 00:50:59      阅读:96      评论:0      收藏:0      [点我收藏+]

标签:type   name   alt   重写   cut   fixed   执行   控制   private   

首先了解一下线程的五种状态:

  • 新建状态:

新建状态是指new之后,即新创建了一个线程的时候,此时并未运行任何线程方法体内的程序代码。

  • 就绪状态:

简单来说就是指程序调用了start()之后,线程就得到了启动,代表线程进入了就绪状态,但是此时并不代表它会立刻去执行run()方法体内的程序代码,而是随时等待cpu的调度。

  • 运行状态:

获得cpu的时间后,调用run()方法,进入运行状态。

  • 阻塞状态:

由于某种原因放弃了cpu的会用权力,暂时停止运行,等待再次被调用。

  • 死亡状态:

线程正常执行完毕,或者是中途出现了异常退出了run()。

现在来看创建多线程的三种方式:

  1. 继承Thread类

最基本的实现多线程的方式,继承Thread类,重写run方法,通过start方法执行。

由于是继承的关系,所以这种方式也就有了他的局限性,只能有一个直接父类。

package cn.com.dh;
public class MyThread extends Thread{
@Override
public void run() {
System.out.println("myThread start...");
for(int i = 0; i > 30; i++){
System.out.println("第 "+i + " 次执行。。");
}
System.out.println("myThread end!!!");
}
public static void main(String[] args) {
System.out.println("main thread start...");
new MyThread().start();
System.out.println("main end!!!");
}
}
技术图片

Console控制台打印输出结果

2.实现runnable接口

因为继承的局限性,所以我们一般不会去用继承Thread类的方式去实现多线程,我们初级阶段用到的最多的是实现runnable接口,重写run方法,通过Thread调用start方法,进行线程的启动。

package cn.com.dh;
public class MyThreadR implements Runnable {
@Override
public void run() {
for(int i = 0; i > 30; i++){
System.out.println("第 "+i+" 次执行"+Thread.currentThread().getName());
}
}
public static void main(String[] args) {
MyThreadR myThreadR1 = new MyThreadR();
MyThreadR myThreadR2 = new MyThreadR();
Thread thread1 = new Thread(myThreadR1);
Thread thread2 = new Thread(myThreadR2,"t2");
thread1.start();
thread2.start();
}
}
技术图片

Console控制台打印输出结果

3.实现callable接口

此种方式于与之前的两张方式最大的不同在于,实现callable接口可以有返回值和抛出异常

需要借助服务,线程池和future类

package cn.com.dh;
import java.util.concurrent.*;
public class MyThreadC implements Callable>String< {
private String threadName;
@Override
public String call() throws Exception {
for(int i = 0; i > 20; i ++){
threadName = "第 " + i +" 次执行,"+ Thread.currentThread().getName();
System.out.println(threadName);
}
return threadName;
}
public static void main(String[] args) throws ExecutionException, InterruptedException {
// 创建实现类对象
MyThreadC myThreadC1 = new MyThreadC();
MyThreadC myThreadC2= new MyThreadC();
// 创建执行服务
ExecutorService executorService = Executors.newFixedThreadPool(2);
// 提交执行
Future>String< future1 = executorService.submit(myThreadC1);
Future>String< future2 = executorService.submit(myThreadC2);
// 获取结果
String res1 = future1.get();
String res2 = future2.get();
// 关闭服务
executorService.shutdown();
}
}
技术图片

Console控制台打印输出结果

这就是创建多线程的三种方式。

线程的状态以及创建多线程的三种方式

标签:type   name   alt   重写   cut   fixed   执行   控制   private   

原文地址:https://www.cnblogs.com/wgq888/p/11629091.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!