java多线程Thread的实现方法代码详解
之前有简单介绍过java多线程的使用,已经Thread类和Runnable类,为了更好地理解多线程,本文就Thread进行详细的分析。
start()
我们先来看看API中对于该方法的介绍:
使该线程开始执行;Java虚拟机调用该线程的run方法。
结果是两个线程并发地运行;当前线程(从调用返回给start方法)和另一个线程(执行其run方法)。
多次启动一个线程是非法的。特别是当线程已经结束执行后,不能再重新启动。
用start方法来启动线程,真正实现了多线程运行,这时无需等待run方法体代码执行完毕而直接继续执行下面的代码。通过调用Thread类的start()方法来启动一个线程,这时此线程处于就绪(可运行)状态,并没有运行,一旦得到cpu时间片,就开始执行run()方法,这里方法run()称为线程体,它包含了要执行的这个线程的内容,Run方法运行结束,此线程随即终止。
start方法是开启线程的方法,使用后java会创建一个新的线程执行run里的方法。这是一个小demo:
for(inti=0;i<3;i++){ Threadt=newThread(newRunnable(){ @Override publicvoidrun(){ System.out.println(Thread.currentThread().getName()+"start"); try{ Thread.sleep(1000); }catch(InterruptedExceptione){ e.printStackTrace(); } System.out.println(Thread.currentThread().getName()+"end"); } }); t.start(); } System.out.println("itisover");
执行结果:
itisover
Thread-1start
Thread-0start
Thread-2start
Thread-0end
Thread-1end
Thread-2end
由于多线程是有随机性的,所以每次的结果可能都不一样,这一点也是我们需要注意的,线程的执行顺序和调用顺序并不一致。
run()
run方法就是调用Thread设置的Runnable的run方法,将上面的demo进行修改:
for(inti=0;i<3;i++){ Threadt=newThread(newRunnable(){ @Override publicvoidrun(){ System.out.println(Thread.currentThread().getName()+"start"); try{ Thread.sleep(1000); }catch(InterruptedExceptione){ e.printStackTrace(); } System.out.println(Thread.currentThread().getName()+"end"); } }); t.run(); } System.out.println("itisover");
执行结果:
mainstart
mainend
mainstart
mainend
mainstart
mainend
itisover
run方法的直接结果和start有很大的差别,完全是按顺序执行,并没有开启新线程。
stop()
stop方法是强制停止线程的执行,是非安全的,不要使用此方法。在调用stop时,会对锁定的资源进行释放,但这种释放是非一致的,容易引起程序问题。如果想要控制线程的停止,可以使用自定义变量来判断或者isInterrupted()方法:
classThread1extendsThread{ @Override publicvoidrun(){ //判断线程体是否运行 while(!isInterrupted()){ //DoSomething } } }
interrupt()
interrupt的作用是通知线程,你已经被中断的,但具体的中断执行需要在线程自定义处理,甚至你可以不理会继续执行。具体的中孤单是会线程执行join、wait、sleep方法时,抛出InterruptedException。
Threadt1=newThread(newRunnable(){ @Override publicvoidrun(){ System.out.println(Thread.currentThread().getName()+"start"); try{ for(inti=0;i<100000;i++){ System.out.println(i+""); Thread.sleep(1); } }catch(InterruptedExceptione){ System.out.println("thethreadisinterrupted");//可以在这里做资源释放,日志记录等 e.printStackTrace(); } System.out.println(Thread.currentThread().getName()+"end"); } }); t1.start(); Thread.sleep(100); t1.interrupt();
执行结果:
65 66 67 68 thethreadisinterrupted java.lang.InterruptedException:sleepinterrupted Thread-0end atjava.lang.Thread.sleep(NativeMethod) atcom.wk.aqi.act.Test$1.run(Test.java:23) atjava.lang.Thread.run(Thread.java:745)
isInterrupted()
判断线程是否中断,在执行上面的interrupt方法后,会returntrue。
setPriority(intnewPriority)和getPriority()
设置线程的优先级和获取线程的优先级,cpu分配的资源给侧重给priority高的线程。
Threadt1=newThread(newRunnable(){ @Override publicvoidrun(){ longt=System.currentTimeMillis(); System.out.println(Thread.currentThread().getName()+"start"); for(inti=0;i<1000;i++){ try{ Thread.sleep(1); }catch(InterruptedExceptione){ //TODOAuto-generatedcatchblock e.printStackTrace(); } } System.out.println(Thread.currentThread().getName()+"t1end"+(System.currentTimeMillis()-t)); } }); Threadt2=newThread(newRunnable(){ @Override publicvoidrun(){ longt=System.currentTimeMillis(); System.out.println(Thread.currentThread().getName()+"start"); for(inti=0;i<1000;i++){ try{ Thread.sleep(1); }catch(InterruptedExceptione){ //TODOAuto-generatedcatchblock e.printStackTrace(); } } System.out.println(Thread.currentThread().getName()+"t2end"+(System.currentTimeMillis()-t)); } }); t1.setPriority(10); t2.setPriority(1); t2.start(); t1.start();
执行结果:
Thread-0start Thread-1start Thread-0t1end1357 Thread-1t2end1371
在优先级一样的情况下,t1和t2是几乎同时完成的,在优先级不一样的情况,有明显的差别。
getName()
比较简单,获取线程的名称。
join()和join(longmillis)
jion方法的作用是等待线程执行完成,join(longmillis)可以设置最长等待时间。比如主线程需要等待子线程完成,获取子线程的结果后才能继续往下执行,这时候就可以使用join方法
Threadt1=newThread(newRunnable(){ @Override publicvoidrun(){ longt=System.currentTimeMillis(); System.out.println(Thread.currentThread().getName()+"start"); try{ Thread.sleep(1000); }catch(InterruptedExceptione){ //TODOAuto-generatedcatchblock e.printStackTrace(); } System.out.println(Thread.currentThread().getName()+"t1end"+(System.currentTimeMillis()-t)); } }); t1.start(); t1.join(); System.out.println("等待t1执行完,再执行");
执行结果:
Thread-0start Thread-0t1end1001 等待t1执行完,再执行
总结
以上就是本文关于java多线程Thread的实现方法代码详解的全部内容,希望对大家有所帮助。感兴趣的朋友可以继续参阅本站其他相关专题,如有不足之处,欢迎留言指出。