首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >16.Java线程案例

16.Java线程案例

作者头像
Java帮帮
发布2018-03-15 17:27:24
8310
发布2018-03-15 17:27:24
举报
16.Java线程案例

Java 实例 - 查看线程是否存活

以下实例演示了如何通过继承 Thread 类并使用 isAlive() 方法来检测一个线程是否存活:

TwoThreadAlive.java 文件

以上代码运行输出结果为:


Java 实例 - 获取当前线程名称

以下实例演示了如何通过继承 Thread 类并使用 getName() 方法来获取当前线程名称:

TwoThreadGetName.java 文件

以上代码运行输出结果为:


Java 实例 - 状态监测

以下实例演示了如何通过继承 Thread 类并使用 currentThread.getName() 方法来监测线程的状态:

Main.java 文件

以上代码运行输出结果为:


Java 实例 - 线程优先级设置

以下实例演示了如何通过setPriority() 方法来设置线程的优先级:

SimplePriorities.java 文件

以上代码运行输出结果为:


Java 实例 - 死锁及解决方法

死锁是这样一种情形:多个线程同时被阻塞,它们中的一个或者全部都在等待某个资源被释放。由于线程被无限期地阻塞,因此程序不可能正常终止。

java 死锁产生的四个必要条件:

  • 1、互斥使用,即当资源被一个线程使用(占有)时,别的线程不能使用
  • 2、不可抢占,资源请求者不能强制从资源占有者手中夺取资源,资源只能由资源占有者主动释放。
  • 3、请求和保持,即当资源请求者在请求其他的资源的同时保持对原有资源的占有。
  • 4、循环等待,即存在一个等待队列:P1占有P2的资源,P2占有P3的资源,P3占有P1的资源。这样就形成了一个等待环路。

当上述四个条件都成立的时候,便形成死锁。当然,死锁的情况下如果打破上述任何一个条件,便可让死锁消失。下面用java代码来模拟一下死锁的产生。

解决死锁问题的方法是:一种是用synchronized,一种是用Lock显式锁实现。

而如果不恰当的使用了锁,且出现同时要锁多个对象时,会出现死锁情况,如下:

LockTest.java 文件

以上代码运行输出结果为:

此时死锁产生。

为了解决这个问题,我们不使用显示的去锁,我们用信号量去控制。

信号量可以控制资源能被多少线程访问,这里我们指定只能被一个线程访问,就做到了类似锁住。而信号量可以指定去获取的超时时间,我们可以根据这个超时时间,去做一个额外处理。

对于无法成功获取的情况,一般就是重复尝试,或指定尝试的次数,也可以马上退出。

来看下如下代码:

UnLockTest.java 文件

以上实例代码输出结构为:


Java 实例 - 获取线程id

以下实例演示了如何使用 getThreadId() 方法获取线程id:

Main.java 文件

以上代码运行输出结果为:


Java 实例 - 线程挂起

以下实例演示了如何将线程挂起:

SleepingThread.java 文件

以上代码运行输出结果为:


Java 实例 - 终止线程

Java中原来在Thread中提供了stop()方法来终止线程,但这个方法是不安全的,所以一般不建议使用。

本文向大家介绍使用interrupt方法中断线程。

使用interrupt方法来终端线程可分为两种情况:

  • (1)线程处于阻塞状态,如使用了sleep方法。
  • (2)使用while(!isInterrupted()){……}来判断线程是否被中断。

在第一种情况下使用interrupt方法,sleep方法将抛出一个InterruptedException例外,而在第二种情况下线程将直接退出。下面的代码演示了在第一种情况下使用interrupt方法。

ThreadInterrupt.java 文件

以上代码运行输出结果为:


Java 实例 - 生产者/消费者问题

生产者和消费者问题是线程模型中的经典问题:生产者和消费者在同一时间段内共用同一个存储空间,如下图所示,生产者向空间里存放数据,而消费者取用数据,如果不加以协调可能会出现以下情况:

存储空间已满,而生产者占用着它,消费者等着生产者让出空间从而去除产品,生产者等着消费者消费产品,从而向空间中添加产品。互相等待,从而发生死锁。

以下实例演示了如何通过线程解决生产者/消费者问题:

以上代码运行输出结果为:


Java 实例 - 获取线程状态

Java中的线程的生命周期大体可分为5种状态。

  • 1. 新建状态(New):新创建了一个线程对象。
  • 2. 就绪状态(Runnable):线程对象创建后,其他线程调用了该对象的start()方法。该状态的线程位于可运行线程池中,变得可运行,等待获取CPU的使用权。
  • 3. 运行状态(Running):就绪状态的线程获取了CPU,执行程序代码。
  • 4. 阻塞状态(Blocked):阻塞状态是线程因为某种原因放弃CPU使用权,暂时停止运行。直到线程进入就绪状态,才有机会转到运行状态。阻塞的情况分三种:
    • (一)、等待阻塞:运行的线程执行wait()方法,JVM会把该线程放入等待池中。
    • (二)、同步阻塞:运行的线程在获取对象的同步锁时,若该同步锁被别的线程占用,则JVM会把该线程放入锁池中。
    • (三)、其他阻塞:运行的线程执行sleep()或join()方法,或者发出了I/O请求时,JVM会把该线程置为阻塞状态。当sleep()状态超时、join()等待线程终止或者超时、或者I/O处理完毕时,线程重新转入就绪状态。
  • 5. 死亡状态(Dead):线程执行完了或者因异常退出了run()方法,该线程结束生命周期。

以下实例演示了如何获取线程的状态:

Main.java 文件

以上代码运行输出结果为:


Java 实例 - 获取所有线程

以下实例演示了如何使用 getName() 方法获取所有正在运行的线程:

Main.java 文件

以上代码运行输出结果为:


Java 实例 - 查看线程优先级

以下实例演示了如何使用 getThreadId() 方法获取线程id:

Main.java 文件

以上代码运行输出结果为:

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2017-12-29,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Java帮帮 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • Java 实例 - 查看线程是否存活
    • TwoThreadAlive.java 文件
    • Java 实例 - 获取当前线程名称
      • TwoThreadGetName.java 文件
      • Java 实例 - 状态监测
        • Main.java 文件
        • Java 实例 - 线程优先级设置
          • SimplePriorities.java 文件
          • Java 实例 - 死锁及解决方法
            • LockTest.java 文件
              • UnLockTest.java 文件
              • Java 实例 - 获取线程id
                • Main.java 文件
                • Java 实例 - 线程挂起
                  • SleepingThread.java 文件
                  • Java 实例 - 终止线程
                    • ThreadInterrupt.java 文件
                    • Java 实例 - 生产者/消费者问题
                    • Java 实例 - 获取线程状态
                      • Main.java 文件
                      • Java 实例 - 获取所有线程
                        • Main.java 文件
                        • Java 实例 - 查看线程优先级
                          • Main.java 文件
                          领券
                          问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档