创建线程有几种方式
创建线程有三种方式:
a:
extends Thread
class ThreadOne entends Thread{
@Override
public void run(){
......
}
}
需要创建该线程的位置:
ThreadOne t1 = new ThreadOne();
t1.start();
b:
implements Runnable(国产汽车进口发动机)
class ThreadTwo implements Runnable{
@Override
public void run(){
......
}
}
需要创建该线程的位置:
ThreadTwo t = new ThreadTwo();
Thread t2 = new Thread(t); //将定义的线程作为参数传入得到线程
t2.start();
c:
implements Callable<String>---必须结合线程池执行器服务来实现
class ThreadThree implements Callable<String>{
@Override
public String call()throws Exception{
......
return "over";
}
}
然后需要创建线程池执行器服务并提交任务
ExecutorService es = Executors.newFixedThreadPool(6);//可重用的线程池
Executors.newCachedThreadPool();//缓存机制的线程池
Executors.newSingleExecutor();//单一实例的线程执行器
Future<String> f = es.submit(new ThreadThree());
//然后视需求决定是否调用自我阻塞办法get()来得到返回结果
String ok = f.get();
第三种实现Callable接口的方式弥补了原本Runnable接口当中run()的两个不足
a: run()方法定义为void方法 所以无法返回结果
b: 方法没有throws声明所以没法抛出异常
另外这种方式必须结合线程池执行器服务 利用submit将任务提交给执行器
如果需要返回的数据 可以得到提交任务后返回的Future对象 然后调用自我阻塞的get()方法[这个方法会
导致当前线程阻塞]
最后结束执行器的时候需要调用shutdown()或者shutdownNow()...
Java当中常用的线程池:
//可重用的线程池 其中参数代表预留多少活跃线程
ExecutorService es = Executors.newFixedThreadPool(3);
//带缓存机制的线程池 也就是在任务执行结束60秒内线程不消亡
ExecutorService es = Executors.newCachedThreadPool();
//单一实例的线程执行器
ExecutorService es = Executors.newSingleThreadExecutor();