以下实例演示了如何通过继承 Thread 类并使用 isAlive() 方法来检测一个线程是否存活:
以上代码运行输出结果为:
以下实例演示了如何通过继承 Thread 类并使用 getName() 方法来获取当前线程名称:
以上代码运行输出结果为:
以下实例演示了如何通过继承 Thread 类并使用 currentThread.getName() 方法来监测线程的状态:
以上代码运行输出结果为:
以下实例演示了如何通过setPriority() 方法来设置线程的优先级:
以上代码运行输出结果为:
死锁是这样一种情形:多个线程同时被阻塞,它们中的一个或者全部都在等待某个资源被释放。由于线程被无限期地阻塞,因此程序不可能正常终止。
java 死锁产生的四个必要条件:
当上述四个条件都成立的时候,便形成死锁。当然,死锁的情况下如果打破上述任何一个条件,便可让死锁消失。下面用java代码来模拟一下死锁的产生。
解决死锁问题的方法是:一种是用synchronized,一种是用Lock显式锁实现。
而如果不恰当的使用了锁,且出现同时要锁多个对象时,会出现死锁情况,如下:
以上代码运行输出结果为:
此时死锁产生。
为了解决这个问题,我们不使用显示的去锁,我们用信号量去控制。
信号量可以控制资源能被多少线程访问,这里我们指定只能被一个线程访问,就做到了类似锁住。而信号量可以指定去获取的超时时间,我们可以根据这个超时时间,去做一个额外处理。
对于无法成功获取的情况,一般就是重复尝试,或指定尝试的次数,也可以马上退出。
来看下如下代码:
以上实例代码输出结构为:
以下实例演示了如何使用 getThreadId() 方法获取线程id:
以上代码运行输出结果为:
以下实例演示了如何将线程挂起:
以上代码运行输出结果为:
Java中原来在Thread中提供了stop()方法来终止线程,但这个方法是不安全的,所以一般不建议使用。
本文向大家介绍使用interrupt方法中断线程。
使用interrupt方法来终端线程可分为两种情况:
在第一种情况下使用interrupt方法,sleep方法将抛出一个InterruptedException例外,而在第二种情况下线程将直接退出。下面的代码演示了在第一种情况下使用interrupt方法。
以上代码运行输出结果为:
生产者和消费者问题是线程模型中的经典问题:生产者和消费者在同一时间段内共用同一个存储空间,如下图所示,生产者向空间里存放数据,而消费者取用数据,如果不加以协调可能会出现以下情况:
存储空间已满,而生产者占用着它,消费者等着生产者让出空间从而去除产品,生产者等着消费者消费产品,从而向空间中添加产品。互相等待,从而发生死锁。
以下实例演示了如何通过线程解决生产者/消费者问题:
以上代码运行输出结果为:
Java中的线程的生命周期大体可分为5种状态。
以下实例演示了如何获取线程的状态:
以上代码运行输出结果为:
以下实例演示了如何使用 getName() 方法获取所有正在运行的线程:
以上代码运行输出结果为:
以下实例演示了如何使用 getThreadId() 方法获取线程id:
以上代码运行输出结果为: