方式一:继承Thread类
1.自定义一个类继承Thread类;
2.重写Thread类中的run方法(自定义线程的任务代码就放在run方法里);
3.创建Thread子类的对象,并且调用start方法开启线程,(run方法不能直接调用)
示例:
class Demo extends Thread{
public void run(){ //重写run方法
for(int i=0;i<100;i++){
System.out.println("自定义线程"+i)
}
}
public static void main(String[] args){
Demo d = new Demo();
d.start(); //调用start方法开启线程
for(int i=0;i<100;i++){
System.out.println("main线程"+i)
}
}
方式二:实现Runnable接口
Thread类中有构造方法,可以传递Runnable实例。
示例:
class Demo1 implements Runnable{
public void run(){ //重写run方法
for(int i=0;i<100;i++){
System.out.println("自定义线程"+i)
}
}
public static void main(String[] args){
Demo d = new Demo();
Thread thread = new Thread(d);
thread .start(); //调用start方法开启线程
for(int i=0;i<100;i++){
System.out.println("main线程"+i)
}
}
}
继承Thread和实现Runnable的区别:
前者是创建不同任务类实例执行各个线程,不能共享数据;
后者是一个任务类实例创建不同线程传入同一任务类实例,共享资源。
方式三:实现Callable接口
Callable是类似于Runnable的接口,实现Callable接口的类和实现Runnable的类都是可被其它线程执行的任务。
* Callable和Runnable有几点不同:
* (1)Callable规定的方法是call(),而Runnable规定的方法是run().
* (2)Callable的任务执行后可返回值,而Runnable的任务是不能返回值的。
* (3)call()方法可抛出异常,而run()方法是不能抛出异常的,只能在内部消化。
* (4)运行Callable任务可拿到一个Future对象, Future 表示异步计算的结果。它提供了检查计算是否完成的方法,以等待计算的完成,并检索计算的结果。通过Future对象可了解任务执行情况,可取消任务的执行,还可获取任务执行的结果。
public class MyCallable implements Callable<Integer>{
@Override
public Integer call() throws Exception {
int sum = 0;
for(int i = 0;i<10;i++){
sum+=i;
}
return sum;
}
}
public class CallableTest {
public static void main(String[] args) throws Exception{
/*// 第一种方式:通过线程池来获取线程
ExecutorService executor = Executors.newCachedThreadPool();//创建线程池
Future<Integer> future = executor.submit(new MyCallable());//ExecutorService中的submit方法接受一个Runnable或者Callable,然后返回一个Future来获得任务的执行结果或者取消任务。
System.out.println("result:" + future.get());
executor.shutdown();*/
//第二种方式
MyCallable mc = new MyCallable();
FutureTask<Integer> futureTask = new FutureTask<Integer>(mc);
Thread thread = new Thread(futureTask);
thread.start();
System.out.println("result:" + futureTask.get());
}
}
注意: future.get()和futureTask.get()方法会阻塞主线程直到获取‘将来’结果;当不调用此方法时,主线程不会阻塞!
Callable、Future和FutureTask三个类的具体实现见如下文章连接:https://www.cnblogs.com/dolphin0520/p/3949310.html