1创建线程的几种方式
a.继承Thread类实现多线程
b.实现Runnable接口方式实现多线程
c.使用ExecutorService、Callable、Future实现有返回结果的多线程(线程池)
A
//• 定义一个继承Thread类的子类,并重写该类的run()方法;
// • 创建Thread子类的实例,即创建了线程对象;
// • 调用该线程对象的start()方法启动线程。
class SomeThead extends Thraad {
public void run() {
//do something here
}
}
public static void main(String[] args){
SomeThread oneThread = new SomeThread();
步骤3:启动线程:
oneThread.start();
}
B
// 定义Runnable接口的实现类,并重写该接口的run()方法;
//创建Runnable实现类的实例,并以此实例作为Thread的target对象,即该Thread对象才是真正的线程对象。
class SomeRunnable implements Runnable {
public void run() {
//do something here
}
}
Runnable oneRunnable = new SomeRunnable();
Thread oneThread = new Thread(oneRunnable);
oneThread.start();
C
//实现Callable接口 泛型和返回值的类型相同
public class MyCallable implements Callable<String>{
public String call() throws Exception {
return "abc";
}
public class Demo01 {
public static void main(String[] args) throws InterruptedException, ExecutionException {
//1.从线程池工厂中获取线程池对象
ExecutorService es=Executors.newFixedThreadPool(2);
//2.创建线程任务对象
MyCallable mc=new MyCallable();
//3.让线程池自主选择一条线程执行线程任务
Future<String> f=es.submit(mc);
//4.获取线程任务的返回值
System.out.println(f.get());
}
}
Runnable和Callable的区别
1.Runnable执行方法是run(),Callable是call()
- 实现Runnable接口的任务线程无返回值;实现Callable接口的任务线程能返回执 行结果
- call方法可以抛出异常,run方法若有异常只能在内部消化