首页 > 代码库 > Java线程
Java线程
1. 如何创建一个可以执行的线程类
创建一个线程有两个办法:继承Thread类或者实现Runnable接口。
首先:继承Thread类
这里一般只需要我们来重写run这个方法。下面是代码:
public class SimpleThread extends Thread {
public SimpleThread() {
start();
}
@Override
public void run() {
while (true) {
System.out.println(this);
// Imply other thread can run now, but we cannot assume that it will
// work well every time, actually , most of time we can get the same
// result, but not to a certainty.
// yield();
try {
sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
其次:实现Runnable接口,代码如下:
Public class Inner implements Runnable {
private Thread thread;
public Inner(String name) {
thread = new Thread(this, name);
thread.start();
}
public void run() {
while (true) {
try {
Thread.sleep(10);
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
}
}
2. 几个常用的API
这边介绍几个常见而且重要的的线程API,这边JDK文档有更加详细的说明,其实JDK的文档就是个很好的学习资料,常备很重要哦!
方法 |
说明 |
start |
使线程开始执行,实际上这个方法会调用下面的run这个方法,如果这个线程已经开始执行,则会扔出IllegalThreadStateException |
sleep |
是当前已经运行的线程休眠一段时间。如果当前线程已经被别的线程中断的话,将会扔出InterruptedException,而且interrupted标志也会被清空。这个方法有两个版本,具体参看JDK文档。 |
run |
线程执行的业务逻辑应该在这里实现。 |
join |
等待另外一个线程死亡。如果当前线程已经被别的线程中断的话,将会扔出InterruptedException,而且interrupted标志也会被清空。 |
yield |
使当前线程临时的中断执行,来允许其他线程可以执行,因为Java的线程模型实际上映射到操作系统的线程模型,所以对于不同的操作系统,这个方法的就有不同的意义。对于非抢占式Operating System,这个方法使得其他线程得到运行的机会,但是对于抢占式的OS,这个方法没有太多的意义。关于这个方法,后边还有更多的介绍。 |
wait |
Wait方法和后边的两个方法都来自Object。看过Java源码的可以知道,这三个方法都是Native方法,使比较直接的和操作系统打交道的方法。 这个方法的作用是让当前线程等待,直到被唤醒或者等待的时间结束。当前线程进入等待队列的时候,会放弃当前所有的资源,所以当前线程必须获得这些对象的Monitor,否则会扔出IllegalMonitorStateException关于wait方法的更多,后边会有介绍到。 |
notify |
通知其他线程可以使用资源了。这个方法的使用要求很多,总之需要当前线程获得被调用的notify方法的对象的monitor。比如: synchronized (person) { person.notify(); } 其实,获得monitor的方法还有别的,这里简单介绍一下: 1. 执行这个对象的一个同步的方法 2. 执行这个对象的同步块 3. 执行一个同步的静态方法 |
notifyAll |
除了通知所有的线程可以准备执行之外,跟上面的方法要求一样。但是只有一个线程会被选择然后执行,这个就跟优先级和其他状态有关系了。 |
interrupt |
中断线程。 |
这边只是介绍了几个常用的API,但是非常重要,其他的API可以查看JDK的相关文档。
Java线程