详解JAVA多线程(一)
来源:互联网 发布:上海网络推广5atg 编辑:程序博客网 时间:2024/05/22 12:01
一个线程可以有四个状态:
1、新(new):线程对象已经创建,但尚未启动,所以不可运行
2、可运行(runnable):意味着一旦时间分片机制有空闲CPU周期提供给一个线程,那个线程便可立即开始运行,因此,线程可能在,也可能不在运行当中,但一旦条件允许,没有什么能阻止他运行,他既没有死掉,也没有被堵塞。
3、Dead:从自己的run()方法返回后,一个线程便已死掉,亦可调用stop()令其死掉,但会产生一个违例--属于error的一个子类(也就是说我们通常不捕获他),记住一个违例的掷出是一个特殊事件,而不是正常程序运行的一部分。所以不建议你用stop终止线程的运行,另外还有一个destroy()方法(他永远都不会实现),应该尽量避免调用它,因为他非常武断,根本不会接触对对象的锁定。
4、堵塞(Blocked):线程可以运行,但某种东西阻碍了他,若线程处于堵塞状态,调用机制可以简单的跳过他,不给他分配任何的CPU时间,除非线程再次进入可运行状态,否则不会采取任何操作。
线程为什么会堵塞?
堵塞状态是这四个状态中最有趣的,值得我们进一步探讨,线程被堵塞可能是由于下述五个原因造成的:
1、调用sleep(),使线程进入睡眠状态,在规定时间内这个线程是不会运行的。
2、用suspend暂停了线程的运行。除非线程收到resume()消息,否则不会返回“可运行”状态。
3、用wait()暂停了线程的执行。除非线程收到notify()或notifyall()消息,否则不会变成可执行。(这看起来和第2点非常相像,下面会做解释)
4、线程正在等待一些IO操作完成
5、线程试图调用另一个对象的同步方法,但那个对象处于锁定状态,暂时无法使用。
亦可调用yield()自动放弃CPU,以便其他线程能够运行。然而,假如调度机制觉得我们的线程已经拥有足够多的时间,并跳转到另一个线程,就会发生同样的事情。也就是说没有什么能够防止调度机制重新启动我们的线程。线程堵塞后,便有一些原因造成他不能继续执行。
下面这个例子展示了进入堵塞状态的全部五种路径。他们全都存在于名为Blocking.java的一个文件中,但在这采用散落的片段进行解释,首先让我们看看基本的框架
//: Blocking.java
// Demonstrates the various ways a thread
// can be blocked.
511
import java.awt.*;
import java.awt.event.*;
import java.applet.*;
import java.io.*;
//////////// The basic framework ///////////
class Blockable extends Thread {
private Peeker peeker;
protected TextField state = new TextField(40);
protected int i;
public Blockable(Container c) {
c.add(state);
peeker = new Peeker(this, c);
}
public synchronized int read() { return i; }
protected synchronized void update() {
state.setText(getClass().getName()
+ " state: i = " + i);
}
public void stopPeeker() {
// peeker.stop(); Deprecated in Java 1.2
peeker.terminate(); // The preferred approach
}
}
class Peeker extends Thread {
private Blockable b;
private int session;
private TextField status = new TextFie ld(40);
private boolean stop = false;
public Peeker(Blockable b, Container c) {
c.add(status);
this.b = b;
start();
}
public void terminate() { stop = true; }
public void run() {
while (!stop) {
status.setText(b.getClass().getName()
+ " Peeker " + (++session)
+ "; value = " + b.read());
try {
sleep(100);
} catch (InterruptedException e){}
}
}
} ///:Continued
- 详解JAVA多线程(一)
- Java多线程详解(一)
- Java 多线程详解(一)
- Java多线程详解(一)
- Java----多线程详解(一)
- java多线程详解(一)
- Java-多线程机制详解(一)
- 原创Java多线程详解(一)
- java中多线程详解(一)
- 多线程详解(一)
- java多线程:多线程(一)
- JAVA进阶学习-多线程基础详解(一)
- Java多线程之详解ThreadLocal类(一)
- Java--多线程(一)
- java(多线程 一)
- JAVA多线程(一)
- java多线程(一)
- Java多线程(一)
- 并查集 知识讲解
- PHP常量的声明和使用
- 数据库设计4
- ios应用, 设置不自动备份到iCloud
- ServletContext的用途
- 详解JAVA多线程(一)
- POJ3207-Ikki's Story IV - Panda's Trick(2-SAT)
- ActiveReport入门教程(四) - 数据按钮栏和数据卡片组
- 数据库设计5
- jsp中tag打不开的原因
- C/C++:函数模板与类模板
- 【VC编程技巧】窗体☞3.9静态窗口分割 (固定分割线)
- 利用决策树分类时划分数据集的特征的选取:信息增益
- 关于腾讯云服务器使用FTP详细配置教程