下次再看看源碼
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();
}}