关闭

线程加入,休眠,中断,礼让操作

338人阅读 评论(0) 收藏 举报
分类:

一.线程的休眠

一种能控制线程行为的方法是调用sleep()方法,sleep()方法需要一个参数用于指定该线程休眠的时间,该时间以毫秒为单位,他通常在run()方法内的循环中被使用

sleep()方法的语法如下:
try{

Thread.sleep(2000);

}catch(InterruptedException e){

e.printStackTrace();

}

上述代码会使线程在2秒内不会进入就绪状态。由于sleep()方法的执行有可能抛出异常,因此放入try/catch块中。虽然使用了sleep()方法的线程在一段时间内会醒来,但是并不能保证它醒来后进入运行状态,只能保证它醒来后进入就绪状态

下面看一下实例:

package llxlqy;
public   class llx {
private int count=10;
public llx(){
new Thread(new Runnable(){
public void run(){
while(true){
try{
Thread.sleep(1000);
}catch(InterruptedException e){
e.printStackTrace();
}
System.out.print(count+" ");
if(--count==0)return;

}
}
}).start();
};
public static void main(String[] args){
new llx();

}

}

效果如下:



二.线程的加入

        如果当前某程序为多线程程序,假如存在一个线程A,现在需要插入线程B,并要求线程B先执行完毕,然后再继续执行线程A,此时可以使用Thread类中的join()方法来完成。这就好比此时读者正在看电视,突然有人上门收水费,读者必须付完水费后才能继续看电视。

        当某个线程使用join()方法加入到另外一个线程时,另一个线程会等待该线程执行完毕后再继续执行。

下面看个使用join()方法的实例。

package llxlqy;
public   class llx {
private int countA=5;
private int countB=5;
private Thread threadA;
private Thread threadB;
public llx(){
threadA=new Thread(new Runnable(){
public void run(){
try{
threadA.sleep(100);
            threadB.join();
}catch(InterruptedException e){
e.printStackTrace();
}
System.out.print("countA:");
while(true){
try{
Thread.sleep(500);
}catch(InterruptedException e){
e.printStackTrace();
}
System.out.print(countA+" ");
if(--countA==0)return;
}
}
});
threadA.start();
threadB=new Thread(new Runnable(){
public void run(){
System.out.print("countB:");
while(true){
try{
Thread.sleep(500);
}catch(InterruptedException e){
e.printStackTrace();
}
System.out.print(countB+" ");
if(--countB==0)return;
}
}
});
threadB.start();
};
public static void main(String[] args){
new llx();
}
}


效果如下:


三.线程的中断

如果线程是因为使用了sleep()或wait()方法进入了就绪状态,可以使用Thread类中interrupt()方法使线程离开run()方法,同时结束线程,但程序会抛出InterruptedException异常,用户可以在处理该异常时完成线程的中断业务处理,如终止while循环

package kop;
public   class op {
private int countA=10;
public op(){
Thread threadA=new Thread(new Runnable(){
public void run(){
while(true){
try{
Thread.sleep(1000);
}catch(InterruptedException e){
System.out.print("当前线程被中断");
break;
}
System.out.print(countA+" ");
if(--countA==0)return;
}
}
});
threadA.start();
threadA.interrupt();
};
public static void main(String[] args){
new op();
}
}

在本实例中,由于调用了interrupted()方法,所以抛出了InterruptedException异常。


四.线程的礼让

Thread类中提供了一种礼让方法,使用yield()方法表示,它只是给当前正处于运行状态下的线程一个提醒,告知它可以将资源礼让给其他线程,但这仅是一种暗示,没有任何一种机制保证当前线程会将资源礼让。

yield()方法使具有同样优先级的线程有进入可执行状态的机会,当当前线程放弃执行权时会再度回到就绪状态。对于支持多任务的操作系统来说,不需要调用yeild()方法,因为操作系统会为线程自动分配CPU时间片来执行

0
0
查看评论

多线程_线程控制之礼让线程

package cn.itcast_04; /* * public static void yield():暂停当前正在执行的线程对象,并执行其他线程。 * * 让多个线程的执行更和谐,但是不能靠它保证一人一次。 */ public class ThreadYieldDemo { p...
  • L1585931143
  • L1585931143
  • 2017-03-09 20:20
  • 414

线程的礼让

线程的礼让
  • wangyanming123
  • wangyanming123
  • 2016-05-03 22:56
  • 524

Java_基础—设置休眠/守护/插队/礼让/优先级线程

一、休眠线程(Sleep) 二、守护线程(setDaemon) 三、加入(插队)线程(join) 四、礼让线程(yield)(了解) 五、设置优先级线程(setPriority)(了解)
  • SoarFly0807
  • SoarFly0807
  • 2017-09-02 17:24
  • 120

线程的优先级设定与礼让

线程的优先级设定与礼让
  • wangyanming123
  • wangyanming123
  • 2016-04-06 16:47
  • 207

内核线程 中断上下文 睡眠

1)中断处理程序(top half)中不能睡眠,是因为哪个原因:a)没有进程上下文,睡眠之后不能重新调度?b)中断程序可能关闭了所有中断(使用SA_INTERRUPT),那么再睡眠,就没有抢占点了(中断都进不来,哪里可以schedule()?)2)kernel thread (ps 中名称...
  • guogaofeng1219
  • guogaofeng1219
  • 2011-03-19 09:53
  • 6372

线程的礼让(Thread.yield())方法

在多线程里面有各种各样的方法,其中有一个礼让的方法很有意思,现实生活中所谓的礼让,就是“委屈自己方便他人”!比如过马路,汽车礼让行人,当然这是在国外,国内过个斑马线是要看司机的性格的!那么在线程中是个什么情况呢,下面看一下demo public class yeld { public stati...
  • hello_word2
  • hello_word2
  • 2016-10-21 17:54
  • 2101

Java的常用方法--Java多线程机制

 1、Java的线程类与Runnable接口 Thread类 public Thread() 创建线程对象 public Thread(Runnable target) target 称为被创建线程的目标对象,负责实现Runnable接口 线程优先级 Thread类有三个有关线程优先级的静...
  • yzkzoo
  • yzkzoo
  • 2007-10-29 23:17
  • 365

Java线程常用的操作方法

目标:  了解设置和取得线程的名称。 了解线程的强制运行。 了解线程的休眠。 了解线程的礼让。 了解线程的中断操作。 具体内容:在多线程中所有的操作方法实际上都是从Thread类开始的。所有的操作都是在Thread类之中的。 线程操作的主要方法 NO 方法名称 类型 描述 1 ...
  • u013087513
  • u013087513
  • 2016-06-15 17:50
  • 1991

qt 线程睡眠

引用文件: #include Qt为我们提供了几个可以用于线程Sleep的函数,分别是: void QThread::sleep ( unsigned long secs )   [static protected] void QThread::msleep ( unsigned...
  • yal179
  • yal179
  • 2014-04-02 16:25
  • 1505

进程线程中睡眠函数(sleep)被信号中断后失效,处理方式总结

进程线程中睡眠函数sleep被信号中断后失效,处理方式 很多时候根据程序运行需要,或者调试什么的,需要在程序中延时。当然一般应用的是sleep 函数 , 但是有些时候,如果不注意sleep的用法,那么在多线程编程中,在信号驱使下sleep就会出现失效的特性,或者说起不到延时的作用,原因何在,先...
  • qimi123456
  • qimi123456
  • 2016-08-16 22:59
  • 2760
    个人资料
    • 访问:82183次
    • 积分:1671
    • 等级:
    • 排名:千里之外
    • 原创:79篇
    • 转载:29篇
    • 译文:0篇
    • 评论:8条
    博客专栏
    文章分类
    最新评论