??
????????不过要注意的是同一个线程只能调用一次start方法,调用多次就会抛出IllegalThreadStateException。例如下面那样写就会出现问题:
Runnable runnable = new MyRunnable(); Thread th = new Thread(runnable); th.start(); th.start();

????????了解了两种创建线程的方式后我们再来思考这样一个问题:既然继承Thread类已经可以实现多线程了,为什么还会有实现Runnable接口方式呢?
??
????????其实,实现Runnable接口相对于继承Thread类来说,有如下好处:
?????????? 1、可以避免由于java单继承特性带来的局限。我们经常碰到这样一种情况,即当我们要将已经继承了某一个类的子类放入多线程中,由于一个类不能同时有多个父类,所以不能用继承Thread的方式,那么这个类就只能采用实现Runnable接口的方式了。
????????????2、适合多个相同程序代码的线程去处理同一资源的情况,把线程同程序代码、数据有效分离,更好的体现了面向对象的设计思想。java多线程避免死锁
????????线程虽然可以“睡觉”(sleep),但是睡觉是一件不靠谱的事情,就像我们小学语文学过的课文《一分钟》,元元因为多睡了一分钟而迟到了二十分钟。所以说时间观念很重要。在多线程中如果某个线程“睡太久”了,我们是不是有什么办法来阻止呢?stop()和interrupted()方法就是来对其进行“惩罚”的。不过由于stop()方法具有固有的不安全性所以现在不怎么使用了。下面用interrupted()模拟元元由于迟到时间超过了一分钟,所以被老师惩罚不准进教室。
package com.gk.thread.demo;
import java.text.SimpleDateFormat;
import java.util.Date;
public class InterruptRunnable implements Runnable{
@Override
public void run() {
System.out.println(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()));
try {
Thread.sleep(1 * 1000 * 60 * 20); // 模拟元元“迟到”了20分钟
} catch (InterruptedException e) {
//throw new RuntimeException(e);
//System.out.println("catch : " + Thread.currentThread().isInterrupted()); // false
System.out.println("元元,你迟到的时间超过一分钟,已经不能进教室了...");
}
System.out.println(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()));
}
}
????????运行程序
public static void interrupt() throws InterruptedException {
Runnable r = new InterruptRunnable();
Thread th = new Thread(r, "元元");
th.start();
// 如果元元迟到的时间超过1分钟就不准他进教室
Thread.sleep(1 * 1000 * 60);
th.interrupt();
}
????????当另一个线程在该线程上调用interrupt()方法的时候,将给该线程设定一个标志,表明该线程已经被中断,并抛出了InterruptedException异常。然而异常被捕获时将清理这个标志,所以在catch子句中,如果使用isinterrupted()判断该异常是否中断时将返回false。
??
????????至此,我们已经学习了java多线程的一些基本知识,虽然在具体的编程中这些并不怎么用,但是却是我们以后理解那些高级应用的基础,所以说基础很重要。在以后的时间中我会写一些关于同步、死锁和生产者消费者模式及其他一些JDK1.5中java.util.concurrent包类的应用。
本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/jisuanjixue/article-76705-2.html
假的
有多少项多少项成果
实在不行拍拍屈股跑路