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创建线程的资料请关注毛票票其它相关文章!