基础篇三

本节主要用来讲解线程对象的一些非常重要的方法,有些我们现在可能还很少使用,但是重要性是毋庸置疑的,在学习中大家会逐渐感受到这些。
关于start方法,我们在此还要简单说下。任何一个线程(除了主线程之外)都需要通过线程对象调用start方法来启动,调用start方法。我们把线程的行文方法在run方法中,书上说我们不能直接调用run方法,但是事实究竟如何?我们来看下下面这个例子:
public class Test{
public static void main(String[] args){
TestThread tt = new TestThread();
//tt.run();
tt.start();
for(int i = 0;i <10;i++){
System.out.println(Thread.currentThread().getName());
}
}
}
class TestThread extends Thread{
public void run(){
for(int i = 0;i <10;i++){
System.out.println(Thread.currentThread().getName()+i);
}
}
}
运算结果为:
main
Thread-00
main
Thread-01
main
Thread-02
main
Thread-03
main
Thread-04
main
Thread-05
main
Thread-06
main
Thread-07
main
main
Thread-08
Thread-09

假如我们把注释符去掉,改为
tt.run();
//tt.start();
结果将变成下面这样:
main0
main1
main2
main3
main4
main5
main6
main7
main8
main9
main
main
main
main
main
main
main
main
main
main

相信大家都发现有什么样的不同了吧,当我们调用start方法时,JVM为线程对象开启了一个真正的线程,此例中为Thread-0,和主线程main是相对独立的两个线程。令我们惊讶的是,调用run方法是可行的,而且也能实现循环输出的作用,但是我们发现,调用run方法的线程竟然是主线程main。这下我们终于明白了,调用start方法时是启动一个线程,而如果调用run方法,只是相当于调用TestThread类中的一个普通方法,所以程序中只有main这一个线程存在。
线程中的interrupt、interrupted和isInterrupted方法,我们在课上并没有着重学习,对于线程的中断状态这一概念也并没有多少了解,但是大家对这块内容一定不能掉以轻心,随着我们学习的深入、技术水平的提高,这部分的内容将会派上大用场。
关于这几个方法,我们必须首先要弄清楚中断状态和中断的区别,中断可以理解为让线程暂停,而改变中断状态则不然,假如一个线程调用了wait、sleep或yield方法,线程已经暂停运行,此时调用interrupt方法,会中断线程目前的状态,即就绪或者是阻塞状态,如果没有别的线程抢占资源,它将会继续执行。让我们来看下下面这个例子:
public class Test{
public static void main(String[] args){
TestThread tt = new TestThread();
tt.start();
tt.interrupt();
}
}
class TestThread extends Thread{
public void run(){
for(int i = 0;i <10;i++){
System.out.println("-----------------");
if(i == 5){
try{
Thread.sleep(2000);
}catch(InterruptedException e){
e.printStackTrace();
}
}
}
}
}
我们启动一个线程之后,for循环在执行了6此之后进入sleep,进入阻塞状态,此时在main线程中调用的interrupt方法中断了sleep后的阻塞状态,这将会抛出InterruptedException异常,但是,此时tt线程的阻塞状态将会立刻终止,进入就绪状态,接着执行for循环剩下的语句,不需要等待sleep中设定的时间。

结果如下:
-----------------
-----------------
-----------------
-----------------
-----------------
-----------------
java.lang.InterruptedException: sleep interrupted
at java.lang.Thread.sleep(Native Method)
at TestThread.run(Test.java:14)
-----------------
-----------------
-----------------
-----------------

大家运行时注释掉tt.interrupt()之后再运行,将很明显的感觉到二者的不同。
interrupted和isInterrupted方法的验证我尝试写了程序,但是效果都不明显,如果有合适的我会粘贴上来的,希望大家也多多提意见,有什么好的思路和想法都贴上来大家讨论讨论。
有关sleep方法的使用,我们目前水平有限,可能会经常使用sleep方法来实现线程暂停等待,诗剑作为编程高手,设计的项目和我们的简单程序自然有天壤之别,从全局考虑,他不支持使用sleep方法也是有道理的,毕竟sleep方法使得线程在睡眠期间也不会释放占有的资源,在同步中属于“流氓线程”,相比之下,yield和wait方法就要显得温柔的多,但是使用起来可能会比sleep稍显困难。
由于个人理解水平有限,只能分析到这种程度,还需要大家多思考多交流,毕竟编程是一堆人做的事。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值