gpt4 book ai didi

JAVA线程sleep()和wait()详解及实例

转载 作者:qq735679552 更新时间:2022-09-27 22:32:09 26 4
gpt4 key购买 nike

CFSDN坚持开源创造价值,我们致力于搭建一个资源共享平台,让每一个IT人在这里找到属于你的精彩世界.

这篇CFSDN的博客文章JAVA线程sleep()和wait()详解及实例由作者收集整理,如果你对这篇文章有兴趣,记得点赞哟.

JAVA线程sleep()和wait()详解及实例 。

sleep 。

1.sleep是Thread的一个静态(static)方法。使得Runnable实现的线程也可以使用sleep方法。而且避免了线程之前相互调用sleep()方法,引发死锁.

2.sleep()执行时需要赋予一个沉睡时间。在沉睡期间(阻塞线程期间),CPU会放弃这个线程,执行其他任务。当沉睡时间到了之后,该线程会自动苏醒,不过此时线程不会立刻被执行,而是要等CPU分配资源,和其他线程进行竞争.

3.此外如果这个线程之前获取了一个机锁,在沉睡期间,这个机锁不会释放。其他等待这个机锁的程序,必须等待这个线程醒来,且执行完后才能运行.

sleep相关代码 。

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
public class ThreadTest2 {
 
   public static void main(String[] args){
     System.out.println( "begin our test" );
     ThreadSleep sleep = new ThreadSleep();
     try {
       Thread thread1 = new Thread(sleep, "路人甲" );
       Thread thread2 = new Thread(sleep, "路人乙" );
       thread1.start();
       thread2.start();
     } catch (Exception e){
       e.printStackTrace();
     }
     System.out.println( "test is over" );
   }
 
 
}
 
  class ThreadSleep implements Runnable{
 
    int count = 0 ;
 
    @Override
    public void run(){
      System.out.println(Thread.currentThread().getName() + " say : hello sleep !!" );
      count();
 
    }
 
    public void count(){
      while (count < 20 ) {
          System.out.println(Thread.currentThread().getName() + " say : count is " + count);
          try {
            count++;
            Thread.sleep( 100 );
          } catch (Exception e) {
            e.printStackTrace();
          }
      }
 
    }
}

输出日志 。

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
begin our test
test is over
路人甲 say : hello sleep !!
路人甲 say : count is 0
路人乙 say : hello sleep !!
路人乙 say : count is 1
路人甲 say : count is 2
路人乙 say : count is 2
路人甲 say : count is 4
路人乙 say : count is 4
路人甲 say : count is 6
路人乙 say : count is 7
路人乙 say : count is 8
路人甲 say : count is 8
路人甲 say : count is 10
路人乙 say : count is 10
路人乙 say : count is 12
路人甲 say : count is 12
路人乙 say : count is 14
路人甲 say : count is 14
路人甲 say : count is 16
路人乙 say : count is 16
路人甲 say : count is 18
路人乙 say : count is 18

通过日志可以发现线程甲和线程乙基本是交替执行,但是并不规律,且出现了并发问题.

该情况是由于代码中设置了睡眠时间为100毫秒,由于count递增执行速度很快,所以线程差不多是同时睡眠,然后同时苏醒并导致了并发的出现.

接下来要添加synchronize块,检查sleep时机锁是否释放 。

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
public class ThreadTest2 {
 
   public static void main(String[] args){
     System.out.println( "begin our test" );
     ThreadSleep sleep = new ThreadSleep();
     try {
       Thread thread1 = new Thread(sleep, "路人甲" );
       Thread thread2 = new Thread(sleep, "路人乙" );
       thread1.start();
       thread2.start();
     } catch (Exception e){
       e.printStackTrace();
     }
     System.out.println( "test is over" );
   }
 
 
}
 
class ThreadSleep implements Runnable{
 
   int count = 0 ;
 
   @Override
   public void run(){
     System.out.println(Thread.currentThread().getName() + " say : hello sleep !!" );
     count();
 
   }
 
   public void count(){
     while (count < 20 ) {
       synchronized ( this ) {
         System.out.println(Thread.currentThread().getName() + " say : count is " + count);
         try {
           count++;
           Thread.sleep( 100 );
         } catch (Exception e) {
           e.printStackTrace();
         }
 
       }
     }
 
   }
}

输出日志 。

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
begin our test
路人甲 say : hello sleep !!
路人甲 say : count is 0
test is over
路人乙 say : hello sleep !!
路人甲 say : count is 1
路人甲 say : count is 2
路人甲 say : count is 3
路人甲 say : count is 4
路人甲 say : count is 5
路人甲 say : count is 6
路人甲 say : count is 7
路人甲 say : count is 8
路人甲 say : count is 9
路人甲 say : count is 10
路人甲 say : count is 11
路人甲 say : count is 12
路人甲 say : count is 13
路人甲 say : count is 14
路人甲 say : count is 15
路人甲 say : count is 16
路人甲 say : count is 17
路人甲 say : count is 18
路人甲 say : count is 19
路人乙 say : count is 20

通过日志可以看出,基本是线程甲在执行,这是因为sleep时,机锁一直在线程甲上,所以线程乙只能一直等待直到线程甲释放锁.

wait 。

1.wait()是Object类的一个方法。当调用wait()方法时,该线程会进入和该对象相关的等待池中,并释放它所拥有的机锁.

2.执行wait()后,必须使用notify()方法或notifyAll()方法或设置等待时间(wait(long time))唤醒在等待线程池中的线程.

3.wait()必须放在synchronized block中,否则会在运行时报“java.lang.IllegalMonitorStateException”异常 。

wait相关代码 。

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
public class ThreadTest2 {
 
   public static void main(String[] args) {
     System.out.println( "begin our test" );
     ThreadSleep sleep = new ThreadSleep();
     try {
       Thread thread1 = new Thread(sleep, "路人甲" );
       Thread thread2 = new Thread(sleep, "路人乙" );
       thread1.start();
       thread2.start();
     } catch (Exception e) {
       e.printStackTrace();
     }
     System.out.println( "test is over" );
   }
}
 
class ThreadSleep implements Runnable {
 
   int count = 0 ;
 
   @Override
   public void run() {
     System.out.println(Thread.currentThread().getName() + " say : hello sleep !!" );
     count();
 
   }
 
   public void count() {
     while (count < 20 ) {
       synchronized ( this ) {
         System.out.println(Thread.currentThread().getName() + " say : count is " + count);
         try {
           count++;
           this .wait( 100 );
         } catch (Exception e) {
           e.printStackTrace();
         }
       }
     }
 
   }
}

输出日志 。

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
begin our test
路人甲 say : hello sleep !!
路人甲 say : count is 0
test is over
路人乙 say : hello sleep !!
路人乙 say : count is 1
路人甲 say : count is 2
路人乙 say : count is 3
路人甲 say : count is 4
路人乙 say : count is 5
路人甲 say : count is 6
路人乙 say : count is 7
路人甲 say : count is 8
路人乙 say : count is 9
路人甲 say : count is 10
路人乙 say : count is 11
路人甲 say : count is 12
路人乙 say : count is 13
路人乙 say : count is 14
路人甲 say : count is 15
路人乙 say : count is 16
路人甲 say : count is 17
路人乙 say : count is 18
路人甲 say : count is 19

通过日志可以发现在wait的情况下,机锁会被释放.

感谢阅读,希望能帮助到大家,谢谢大家对本站的支持! 。

原文链接:https://my.oschina.net/u/241670/blog/842172 。

最后此篇关于JAVA线程sleep()和wait()详解及实例的文章就讲到这里了,如果你想了解更多关于JAVA线程sleep()和wait()详解及实例的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com