当前位置: 首页 > 科技观察

下面跟大家聊一聊Java并发编程中线程的基础

时间:2023-03-23 11:28:53 科技观察

01。简介:要想学好多线程,首先要了解线程的基础知识。本文将带你了解线程的基础知识。02.线程创建方法实现Runnable接口,继承Thread类实现Callable接口。通过FutureTask包装器创建线程。通过线程池创建线程。下面将使用线程池和Callable创建线程publicclassCallableDemoimplementsCallable{@OverridepublicStringcall()throwsException{inta=1;intb=2;System.out.println(a+b);return"executionresult:"+(a+b);}publicstaticvoidmain(String[]args)throwsExecutionException,InterruptedException{//创建一个可复用的线程池,线程数固定为1ExecutorServiceexecutorService=Executors.newFixedThreadPool(1);CallableDemocallableDemo=newCallableDemo();//执行线程,使用future接收线程的返回值Futurefuture=executorService.submit(callableDemo);//打印线程的返回值System.out.println(future.get());executorService.shutdown();}}执行结果3执行结果:303,线程生命周期NEW:初始状态,线程构造完成,但仍然没有调用start方法。RUNNABLED:运行状态,JAVA线程将操作系统中就绪和运行两种状态称为“运行中”。调用线程的start()方法将线程置于就绪状态。BLOCKED:阻塞状态,表示线程进入等待状态,即线程由于某种原因放弃了CPU的使用权。比如访问一个用synchronized关键字修饰的方法时,并没有获得对象锁。Waiting:等待状态,比如调用了wait()方法。TIME_WAITING:超时等待状态,超时后自动返回。比如调用sleep(longmillis)方法TERMINATED:终止状态,表示当前线程已经执行完毕。看源码:publicenumState{NEW,RUNNABLE,BLOCKED,WAITING,TIMED_WAITING,TERMINATED;}04.线程优先级最小线程优先级:1线程最大优先级:10线程默认优先级:5通过调用getPriority()和setPriority(intnewPriority)方法来获取和设置线程的优先级。见源码:/***Theminimumprioritythatthreadcanhave.*/publicfinalstaticintMIN_PRIORITY=1;/***Thedefaultprioritythatisassignedtoathread.*/publicfinalstaticintNORM_PRIORITY=5;*/publicfinalstaticintMAX_PRIORITY=10;看代码:publicclassThreadAextendsThread{publicstaticvoidmain(String[]args){ThreadAa=newThreadA();System.out.println(a.getPriority());//5a.setPriority(8);System.out.println(a.getPriority());//8}}线程优先级特性:继承性:比如A线程启动B线程,则B线程的优先级与A相同。规律性:大部分高-优先级线程总是先执行,但并不意味着所有高优先级线程都先执行。随机性:高优先级的线程不一定每次都先执行。05.线程停止stop()方法,该方法已被标记为废弃,强行停止线程,相当于kill-9。interrupt()方法优雅地停止线程。告诉线程它可以停止。至于线程什么时候停止,取决于线程本身。看一下停止线程的代码:publicclassInterruptDemo{privatestaticinti;publicstaticvoidmain(String[]args)throwsInterruptedException{Threadthread=newThread(()->{//默认isInterrupted返回false,变为truewhile(!Thread.currentThread().isInterrupted()){i++;}System.out.println("Num:"+i);},"interruptDemo");thread.start();TimeUnit.SECONDS.sleep(1);线程。interrupt();//如果不加这句话,thread线程就不会停止}}看上面的代码,主线程的main方法调用了thread线程的interrupt()方法,就是为了告诉thread线程你可以停止它了(其实就是将thread线程的一个属性设置为true),然后thread线程通过isInterrupted()方法获取这个属性,判断是否设置为true。这里我再举个例子来说明,看代码:.out.println("Num:"+i);},"ThreadDemo");thread.start();TimeUnit.SECONDS.sleep(1);interrupt=true;}}是不是很像,再简单总结一下:当其他线程调用当前线程的中断方法时,向当前线程打招呼,告诉他可以中断该线程的执行,不会立即中断该线程。至于什么时候中断,取决于当前线程本身。线程通过检查是否被中断来响应,可以通过isInterrupted()来判断。这种通过标识符中断运行的方式,可以让线程在终止时有机会清理资源,而不是随意停止线程,所以这种终止线程的方式更加安全,也更加优雅。06.线程重置有两种重置方法:Thread.interrupted()throwsInterruptedException然后理解r??eset是什么:当线程运行时,Thread.isInterrupted()返回的线程状态为false,然后调用thread.interrupt()中断线程Thread.isInterrupted()返回线程状态为true,最后调用Thread.interrupted()重置线程Thread.isInterrupted()返回线程状态为false或者在抛出InterruptedException之前,线程会设置状态为假。下面通过两种方式来看看重置线程的代码。首先是Thread.interrupted()重置代码:publicclassInterruptDemo{publicstaticvoidmain(String[]args)throwsInterruptedException{Threadthread=newThread(()->{while(true){//Thread.currentThread().isInterrupted()默认为false,在主模式下执行thread.interrupt()时,状态变为true).isInterrupted());//before:trueThread.interrupted();//重置线程,从true到falseSystem.out.println("after:"+Thread.currentThread().isInterrupted());//after:false}}},"interruptDemo");thread.start();TimeUnit.SECONDS.sleep(1);thread.interrupt();}}ThrowInterruptedException重置线程代码:publicclassInterruptedExceptionDemo{publicstaticvoidmain(String[]args)throwsInterruptedException{Threadthread=newThread(()->{while(!Thread.currentThread().isInterrupted()){try{TimeUnit.SECONDS.sleep(1);}catch(InterruptedExceptione){e.printStackTrace();//打破;}}},"中断演示");线程.sstart();TimeUnit.SECONDS.sleep(1);thread.interrupt();System.out.println(thread.isInterrupted());}}结果:falsejava.lang.InterruptedException:sleepinterruptedatjava.lang.Thread.sleep(NativeMethod)在java.lang.Thread.sleep(Thread.java:340)在java.util.concurrent.TimeUnit.sleep(TimeUnit.java:386)在com.cl.concurrentprogram.InterruptedExceptionDemo.lambda$main$0(InterruptedExceptionDemo.java:16)atjava.lang.Thread.run(Thread.java:748)需要注意的是,InterruptedException的抛出并不意味着必须终止线程,而是提醒当前线程发生了中断操作。至于下一步,就看线程本身了,比如直接捕获异常,不做任何处理,把异常抛出去停止当前线程,如果抛出InterruptedException,就打印异常信息像我上面的例子,我会跳出循环,让线程thread终止。为什么要重置:Thread.interrupted()属于当前线程。是当前线程对外部中断信号的响应,表示已经收到中断信号,但不会立即中断自己。什么时候打断取决于你让外界知道。在中断之前,他的中断状态还是false,所以才会被重置。

最新推荐
猜你喜欢