JAVA-多线程-创建线程的三种方式
Posted torain
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了JAVA-多线程-创建线程的三种方式相关的知识,希望对你有一定的参考价值。
JAVA-多线程-创建线程的三种方式
- 并发:同一时间只有一条指令在执行,多个进程的指令被快速轮换执行。
- 并行:同一时间有多条指令在多个处理器上运行。
- 进程:每个运行中的程序就是一个进程。
- 线程:线程(Thread)也被称为轻量级进程(Lightweight Process),线程是进程的执行单元,在程序中是独立、并发的执行流。
多线程不会提高程序运行速度,但是会提高运行效率。
创建和使用线程的三种方式
继承Thread类创建的线程类
Thread类构造方法摘要
Thread() // 分配新的 Thread 对象。
Thread(String name) // 分配新的 Thread 对象。
Thread(Runnable target) // 分配新的 Thread 对象。
Thread(Runnable target, String name) //分配新的 Thread 对象。
Thread类方法摘要
currentThread() // 返回对当前正在执行的线程对象的引用。
getName() // 返回该线程的名称。
run() // 如果该线程是使用独立的 Runnable 运行对象构造的,则调用该 Runnable 对象的 run 方法;否则,该方法不执行任何操作并返回。
setName(String name) // 改变线程名称,使之与参数 name 相同。
start() //使该线程开始执行;Java 虚拟机调用该线程的 run 方法。
sleep(long millis) //在指定的毫秒数内让当前正在执行的线程休眠(暂停执行),此操作受到系统计时器和调度程序精度和准确性的影响。
通用的获取线程名称方法:Thread.currentThread().getName();
创建过程
- 创建Thread子类,重写run()方法,run()方法称为线程的执行体。
- 实例化Thread子类。
- 实例调用start()方法开启线程。
代码
// Thread子类
public class MyThread extends Thread{
public MyThread() {
super();
}
public MyThread(String name) {
super(name);
}
// Override描述线程任务
public void run() {
for (int i = 0;i < 100;i ++) {
System.out.println(Thread.currentThread().getName() + i);
}
}
}
// 主线程
public static void main(String[] args) {
// 创建线程对象
MyThread mt = new MyThread("main");
// 开启线程
mt.start();
}
实现Runnable接口创建线程
使用Runnable接口的好处
Runnable接口的实现类只需要做一件事,那就是重写run()方法。好处是:
- 解决了单纯使用Thread类耦合性过强的问题
- run()方法可以返回值
- Thread类可以只用来启动线程
创建过程
- 定义Runnable接口的实现类,重写run()方法。
- 将Runnable的实现类的实例作为Thread的target实例化Thread类。
- 使用Thread的实例启动线程。
代码
// Runnable实现类
public class MyRunnable implements Runnable{
// 重写run()方法
public void run() {
for (int i = 0;i<100;i++) {
System.out.println(Thread.currentThread().getName() + ":" + i);
}
}
}
// 主线程
public static void main(String[] args) {
// 创建线程任务对象
MyRunnable mr = new MyRunnable();
// 创建线程对象并明确线程任务
Thread th = new Thread(mr);
// 启动线程
th.start();
// 描述主线程的任务
for (int i=0;i<100;i++) {
System.out.println(Thread.currentThread().getName() + ":" + i);
}
}
使用线程池创建线程
在JDK1.5前的程序员将多个线程封装到ArrayList集合中,用这种方式来进行简化创建线程的操作。在JDK1.5后java添加了线程池的功能。
方法和类
- Callable接口:与Runnable接口功能相似,用来指定线程的任务。其中的call()方法,用来返回线程任务执行完毕后的结果,call方法可抛出异常。
- ExecutorService:线程池类
Future submit(Callable task):获取线程池中的某一个线程对象,并执行线程中的call()方法
- Future接口:用来记录线程任务执行完毕后产生的结果。
创建过程
- 创建线程池对象
- 创建Callable接口子类对象
- 提交Callable接口子类对象
- 关闭线程池
代码
// Callable实现类
public class TestCallable implements Callable<Integer>{
private int num;
// 重写call()
public Integer call() throws Exception {
int sum = 0;
for (int i = 0;i <= 10;i ++) {
sum += i;
}
return sum;
}
public TestCallable(int num) {
super();
this.num = num;
}
}
// 主线程
public static void main(String[] args) {
// 实例化线程池
ExecutorService es = Executors.newFixedThreadPool(3);
// 实例化Callable类
TestCallable tc = new TestCallable(10);
// 使用地址池实例创建线程并使用Future实例接收
Future<Integer> f = es.submit(tc);
try {
// 输出结果
System.out.println(f.get());
} catch (InterruptedException | ExecutionException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
最后
所有的类的实例化完全可以使用匿名类进行处理,这样会让代码更简洁,也不会占用过多资源。
以上是关于JAVA-多线程-创建线程的三种方式的主要内容,如果未能解决你的问题,请参考以下文章
java核心学习(二十一) 多线程---创建启动线程的三种方式