java 创建线程的四种方式
1、继承Thread类方式
这种方式适用于执行特定任务,并且需要获取处理后的数据的场景。
举例:一个用于累加数组内数据的和的线程。
publicclassAdditionThreadextendsThread{
privateintsum=0;
privateint[]nums;
publicAdditionThread(int[]nums,StringthreadName){
super(threadName);
this.nums=nums;
}
@Override
publicvoidrun(){
for(intnum:nums){
sum+=num;
}
}
publicintgetSum(){
returnsum;
}
}
调用方式:
publicclassMain{
publicstaticvoidmain(String[]args)throwsInterruptedException{
int[]nums={10,12,15,200,100};
AdditionThreadthread=newAdditionThread(nums,"AdditionThread");
thread.start();
thread.join();
System.out.println("sum="+thread.getSum());
}
}
2、Runnable接口方式
定义一个实现Runnable接口的类,或者直接创建一个匿名内部类,并覆盖run()方法。最后作为参数传给Thread的构造函数。
publicclassMain{
publicstaticvoidmain(String[]args){
//自定义的Runnable
Runnablerunnable=newMyRunnable();
Threadthread=newThread(runnable,"Runnable-Thread");
thread.start();
//自定义匿名内部类
newThread(()->{
System.out.println("Innerclass");
}).start();
}
staticclassMyRunnableimplementsRunnable{
@Override
publicvoidrun(){
System.out.println("MyRunnable");
}
}
}
3、Callable接口方式
Callable接口与Runnable接口的区别:
(1)Callable的方法为call(),Runnable的方法为run()。
(2)Callable的方法由返回值,Runnable没有。
(3)Callable的方法声明的Exception,Runnable的没有。
publicclassMain{
publicstaticvoidmain(String[]args){
MyCallablemyCallable=newMyCallable();
FutureTasktask=newFutureTask<>(myCallable);
Threadthread=newThread(task,"FutureTask");
thread.start();
try{
//通过get方法获取返回值
Stringresult=task.get();
System.out.println(result);
}catch(InterruptedException|ExecutionExceptione){
e.printStackTrace();
}
}
staticclassMyCallableimplementsCallable{
@Override
publicStringcall()throwsException{
//模拟超时操作
Thread.sleep(1000);
return"OK";
}
}
}
4、线程池方式
我们可以通过ThreadPoolExecutor类的构造函数来创建线程池,也可以通过Executors工厂方法来创建,如
//创建固定线程数的线程池 Executors.newFixedThreadPool(); //创建只有一个核心线程的线程池 Executors.newSingleThreadExecutor(); //创建一个没有核心线程,但可以缓存线程的线程池 Executors.newCachedThreadPool(); //创建一个适用于执行定时任务的线程池 Executors.newScheduledThreadPool();
在创建线程池时,最好传入ThreadFactory参数,指定线程池所创建线程的名称。这样有利于分析定位可能存在的问题。
publicclassMain{
privatestaticfinalExecutorServiceSERVICE=
Executors.newFixedThreadPool(5,newBasicThreadFactory("My-Thread"));
publicstaticvoidmain(String[]args){
//打印线程的名字
System.out.println("mainthreadname:"+Thread.currentThread().getName());
SERVICE.execute(()->{
System.out.println("Hellothreadpool.");
//打印线程池里的线程的名字
System.out.println("threadname:"+Thread.currentThread().getName());
});
}
staticclassBasicThreadFactoryimplementsThreadFactory{
privatefinalAtomicIntegerthreadNumber=newAtomicInteger(0);
privatefinalStringbasicName;
publicBasicThreadFactory(StringbasicName){
this.basicName=basicName;
}
@Override
publicThreadnewThread(Runnablerunnable){
Threadthread=newThread(runnable);
Stringname=this.basicName+"-"+threadNumber.incrementAndGet();
thread.setName(name);
returnthread;
}
}
}
以上就是java创建线程的四种方式的详细内容,更多关于java创建线程的资料请关注毛票票其它相关文章!