多线程实现有3种方法,其中前两中是常用的方法,推荐第二种方法,一个类应该在其修改或者加强是才继承
1.继承Thread类,重写run()方法,实例化该类,调用线程start()方法
(1)自定义类,继承Thread类,重写run()方法
(2)创建该Thread子类实例
(3)然后调用线程start()方法
1 | public class TestThread extends Thread{ |
2.实现Runnable接口,并实现该接口的run()的方法,
具体步骤:
(1)自定义类,并实现Runnable接口,实现run()方法
(2)创建Thread子类实例:用实现Runnable接口的对象作为参数实例化个Thread对象
(3)然后调用线程start()方法
1 | public class TestRunnable implements Runnable{ |
3.实现Callable接口,重写call()方法
(1)自定义类,实现Callable接口,实现call()方法
(2)实例化ExecutorService 对象,实例化个刚刚自定义类(实现Callable接口)的对象,把它作为参数调用submit()方法
(3)注意get()方法获取结果会造成阻塞
public static class TestCallable implements Callable{
@Override
public Object call() throws Exception {
/**
* 沉睡6秒,模拟耗时操作
*/
Thread.sleep(6000);
System.out.println("3.TestCallable call:threadName:"+Thread.currentThread().getName()+",threadId:"+Thread.currentThread().getId());
return "这是 TestCallable call 执行完 返回的结果";
}
}
/
实现Callable接口,重写call()方法
/
ExecutorService mExecutorService= Executors.newSingleThreadExecutor();
Future future=mExecutorService.submit(new TestCallable());
try {
/
* future.get()用来获取结果, 会造成线程阻塞,直到call()结束
* 等待线程结束,并且返回结果
* 线程阻塞了
*/
String result= String.valueOf(future.get());
System.out.println("3.TestCallable call return:"+result+","+Thread.currentThread().getName()+",threadId:"+Thread.currentThread().getId());
} catch (Exception e) {
e.printStackTrace();
}
最后附上所有代码
1 | package com.hex168.demo.therad; |
运行结果