多线程的实现方法有三种,分别为继承Thread类,实例化接口runable和实例化接口callable并加入线程池使用。
1继承Thread类
public class Race extendsThread{
@override
public void run (){
System.out.println("这是另一个线程");
}
public static void main(String[] args){
System.out.println("这是主线程");
Race a= new Race();
a.start();
}
}
这种方法比较简洁但是由于继承了Thread类就无法继承别的类了。在java中只允许单继承。
2实现Runable接口,这种实现方式叫做静态代理模式。
public class UseRunable {
public static void main(String[] args) {
race race=new race();
Thread thread1=new Thread(race);
thread1.start();
}
}
class race implements Runnable{
@Override
public void run() {
System.out.println("这是子线程");
}
}
静态代理模式分析:
静态代理模式就是指,本人找代理来进行操作但实际还是自己操作,可是在操作之前和之后代理人员能够做其他事情加强要做的事。比如我租房子,确实是我租,但是我找中介来帮我租房子,但实际还是自己租房子,在租房子之前,中介来进行找房子,商量租房大约金额等事情。为了强调做同一件事我们需要加上约束,这样我们饿就可以使用接口来定义租房子的事。如下例:
Interface ZuFangZi{
void Zufangzi();
}
public class Me implements ZuFangZi{
@Override
void Zufangzi(){
System.out.println("我要租房子");
}
}
public class ZhongJie implements ZuFangZi{
private Me ;
public ZhongJie(Me me){
this.me=me;
}
@Override
void Zufangzi(){
System.out.println("找房源");
me.Zufangzi();
}
}
3实现callable接口,使用着这种方式可以具有返回值还可以声明异常,由于前两种接口或父类没有声明异常所以实例化类和继承类都不能声明异常。但使用Callable可以,使用有点小麻烦。
public class UseCallable {
public static void main(String[] args) {
Race race=new Race();
ExecutorService service=Executors.newFixedThreadPool(1);
Future< Integer > result=service.submit(race);
try {
System.out.println(result.get());
service.shutdown();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (ExecutionException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
class Race implements Callable<Integer>{
@Override
public Integer call() throws Exception {
return new Integer(1235);
}
}
注意使用了泛型!!而且使用时指定什么数据类型就返回值就是什么数据类型。
线程的使用不建议使用 new Thread();这样创建线程性能不是很好,而且无法管理,可能出现无限次创建线程,这样就可能造成创建线程过多,jvm耗费太多内存造成内存溢出,程序崩溃。
一般来讲我们使用new CachedThreadPool()、new FixedThreadPool()、new SingleThreadExecutor创建线程池然后添加相关的runnable或者callable实现类对象。
CachedThreadPool:创建可容纳0-21亿左右(一般认为无限大)线程的线程池,在必要时创建新线程使用,空闲线程会保留60s。空闲线程不会占用资源。
FixedThreadPool:创建固定的数量的线程,空闲线程会一直保留。(只创造一个线程池提交多个线程会顺序等待上一个线程结束后才运行下一个线程);
SingleThreadExecutor:创建只有一个线程的池,该线程会顺序执行每一个提交的任务。