线程进入阻塞状态,可能有如下原因:
(1)sleep();
(2)wait();
(3)等待某个输入/输出完成
(4)试图在某个对象上调用其同步控制方法,但是对象锁不可用。
(5)调用其他对象的join()
其中(3),(4)不可通过interrupt()中断。
(1)用interrupt()终止由于调用sleep()阻塞的线程。
class Base implements Runnable{
public void run(){
try{
Thread.sleep(1000);
} catch(InterruptedException e ){
System.out.println("interruptedException");
}
}
}
public class Test{
public static void main(String[] args){
Thread t = new Thread(new Base());
t.start();
t.interrupt();
}
}
(2)用interrupt()终止由于调用wait()阻塞的线程。
class Base implements Runnable{
public void run(){
Print();
}
public synchronized void Print(){
System.out.println("hello");
try{
wait();
} catch(InterruptedException e ){
System.out.println("Interrupted Exception");
}
}
}
public class Test{
public static void main(String[] args){
Thread t = new Thread(new Base());
t.start();
t.interrupt();
}
}
sleep(),yield()不会释放对象上的锁,而调用wait()时线程的执行被挂起,对象上的锁被释放。
调用wait()notify()notifyAll()的任务在调用这些方法前必须“拥有”(获取)对象的锁。
因此上例中Print()没有加锁操作,即没有synchronized关键字,则会抛异常:
Exception in thread "Thread-0" java.lang.IllegalMonitorStateException
at java.lang.Object.wait(Native Method)
at java.lang.Object.wait(Object.java:485)
at Base.Print(Test.java:8)
at Base.run(Test.java:3)
at java.lang.Thread.run(Thread.java:662)
(5)用interrupt()终止由于join()另一个对象阻塞的线程。
class Sleeper extends Thread {
private int duration;
private volatile double d;
public Sleeper(String name, int sleepTime) {
super(name);
duration = sleepTime;
start();
}
public void run() {
for(int i=0; i<10000000; i++){
d += (Math.PI+Math.E)/(double)i;
}
try{
sleep(duration);
} catch(InterruptedException e ){
System.out.println(getName() + " was interrupted. " +
"isInterrupted(): " + isInterrupted());
return;
}
System.out.println(getName() + " has awakened");
}
}
class Joiner extends Thread {
private Sleeper sleeper;
public Joiner(String name, Sleeper sleeper) {
super(name);
this.sleeper = sleeper;
start();
}
public void run() {
try {
sleeper.join();
} catch(InterruptedException e) {
System.out.println("Interrupted");
}
System.out.println(getName() + " join completed");
}
}
public class Test {
public static void main(String[] args) {
Sleeper sleepy = new Sleeper("Sleepy", 1500);
Joiner dopey = new Joiner("Dopey", sleepy);
dopey.interrupt();
}
}
分享到:
相关推荐
在学习Java多线程的过程中,理解线程与进程的概念是非常基础且重要的一步。首先,进程是一个程序的执行实例,是操作系统资源分配的基本单位,具有独立的地址空间和运行状态。每个进程至少包含一个线程,我们称之为...
### Java多线程学习资料知识点解析 #### 一、引言 Java作为一种广泛使用的编程语言,在并发编程领域具有独特的优势。多线程是Java中实现并发处理的核心技术之一,能够显著提升程序的性能和响应性。本文将深入探讨...
Java多线程学习Java多线程学习Java多线程学习Java多线程学习Java多线程学习Java多线程学习Java多线程学习Java多线程学习Java多线程学习Java多线程学习Java多线程学习Java多线程学习Java多线程学习Java多线程学习Java...
Java多线程学习是编程领域中的重要一环,特别是在服务器端和网络编程中,多线程技术能够有效地利用系统资源,提高程序的并发性。FTP(File Transfer Protocol)上传则是通过网络将本地文件传输到远程服务器的过程。...
总的来说,Java多线程学习涵盖了线程的创建、同步、通信、调度以及异常处理等多个方面,深入理解和掌握这些知识点对于提升Java程序的性能和复杂性至关重要。通过阅读提供的"Java多线程.pdf"文档,你可以进一步了解和...
Java多线程是一块重要的内容,李兴华讲解的Java是一个很好的资源
这篇学习笔记将深入探讨Java多线程的核心概念、实现方式以及相关工具的使用。 一、多线程基础 1. 线程与进程:在操作系统中,进程是资源分配的基本单位,而线程是程序执行的基本单位。每个进程至少有一个主线程,...
下面是对Java多线程学习的详细解析。 1. **多线程概述**: 多线程是指一个程序内可以同时执行多个独立的执行流,每个执行流被称为一个线程。Java通过Thread类来代表线程,每个线程都有自己的生命周期,包括新建、...
总的来说,Java多线程学习涵盖了线程的创建与管理、并发工具的使用、以及高级并发编程策略。理解并掌握这些知识,能够帮助开发者编写出高效、可靠的多线程应用。而Doug Lea的工作不仅推动了Java并发技术的发展,也为...
在“Java多线程学习总结6”这个主题中,我们可以深入探讨Java多线程的实现、管理及优化。下面将详细阐述相关知识点。 1. **线程的创建方式** - **继承Thread类**:自定义类继承Thread类,并重写run()方法,创建...
### CoreJava多线程学习总结 #### 一、基本概念 多线程是现代软件开发中非常重要的一个概念,尤其在Java这样的高级编程语言中,它使得程序能够更高效地利用计算机资源,实现并发处理任务。为了更好地理解CoreJava...
### Java多线程学习教程知识点详解 #### 一、Java多线程简介 Java多线程编程是指在Java应用程序中利用多线程技术提高程序的并发性和效率。相比于C或C++等语言,Java提供了更加高级的语言级支持,使得开发者能够...
【Java 多线程学习详细总结】 在Java编程中,多线程是处理并发执行任务的关键技术。本文将深入探讨Java中的多线程概念、实现方式、线程状态转换、线程调度、线程同步以及数据传递等相关知识。 1. **扩展`java.lang...
本资料“Java多线程学习-动力节点共22页.pdf.zip”提供了对Java多线程的深入学习,旨在帮助开发者掌握这一关键技术。 1. **线程基础**:Java中的线程是通过`Thread`类或者实现`Runnable`接口来创建的。通过继承`...
Java多线程是Java编程中的一个核心概念,它允许程序同时执行多个...PPT文件"Ch17 多线程.ppt"可能会包含更详细的讲解,包括线程安全的数据结构、并发集合、线程间的通信机制等内容,这些都是Java多线程学习的重要部分。
### Java多线程学习笔记 #### 一、线程的基本概念 在计算机科学中,**线程**(Thread)是程序执行流的最小单位。一个标准的程序只能做一件事情,而通过多线程技术,可以让程序同时处理多个任务。在Java中,线程是...
Java多线程学习基础原理主要涉及以下几个方面: 1. 线程的创建和启动 Java提供了两种创建线程的方式:继承Thread类和实现Runnable接口。当创建一个Thread类的子类对象并调用start()方法时,会启动一个新的线程,并...