下次再看看源码
1.在两种线程的创建的方式中分别重写start方法和run方法.... 然后在调用的时候会出现什么情况:
class ReviewSubject extends Thread{
@Override
public synchronized void start() {
System.out.println("ReviewSubject is start...");
}
@Override
public void run() {
System.out.println("ReviewSubject is run...");
}
}
class ReviewSubject2 implements Runnable{
public synchronized void start() {System.out.println("ReviewSubject2 is start...");
}
@Override
public void run() {
System.out.println("ReviewSubject2 is run...");
}
}
public class Test{
public static void main(String[] args) {
/*ReviewSubject rs1=new ReviewSubject();
rs1.start();
rs1.run();
Thread r=new Thread(new ReviewSubject2());
r.start(); //------------输出 "ReviewSubject2 is run..." 怎么跑到run方法里面去了
r.run();
*/
ReviewSubject3 rs3=new ReviewSubject3(); //run方法里面输出当前运行的线程的名字
rs3.start(); //---------输出 "Thread-0"
//rs3.run();//----------输出 "main"
}
}
2.直接调用一个线程的start方法和调用run方法有什么区别
class ReviewSubject3 extends Thread{
@Override
public void run() {
while(true){
try {
Thread.sleep(500);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName());
}
}
}
class ReviewSubject4 implements Runnable{
@Override
public void run() {
while(true){
try {
Thread.sleep(500);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName());
}
}
}
public class Test{
public static void main(String[] args) {
/*
ReviewSubject3 rs3=new ReviewSubject3(); //run方法里面输出当前运行的线程的名字
rs3.start(); //---------循环输出 "Thread-0"
rs3.run();//---------循环输出 "main"
*/
Thread r=new Thread(new ReviewSubject4());
r.start(); //---------循环输出 "Thread-0"
r.run(); //---------循环输出 "main"
r.run();
r.start();
//按照上面的这种方式写没问题
//但是只要把一个线程的两个start方法的调用放到一起,就会报异常:Exception in thread "main" java.lang.IllegalThreadStateException
r.start(); //---------循环输出 "Thread-0"
r.start();
r.run(); //---------循环输出 "main"
r.run();
}}