建立執行緒的兩種方法和同步執行緒的問題
執行緒有兩種建立方式:
1, 繼承Thread類,覆寫Run方法。建立子類物件的同時執行緒也被建立。
2, 實現Runnable介面,再通過Thread類建立執行緒,並將事先了Runnable介面的子類物件作為引數傳遞給Thread類的建構函式。使用匿名內部類來寫。
方法一原始碼:
class ThreadDemo extends Thread{
private String name;
private int num =100;
public ThreadDemo(String name){
super();
this.name=name
}
public void run(){
for(int i=0;i<num;i++){
System.out.println(name+"發了"+i+"份傳單");
}
}
方法二:
class MyThread implements Runnable{
private String name;
public MyThread(String name) {
super();
this.name =name;
}
@Override
public void run() {
for
System.out.println(name+"發了"+i+"禮物");
}
}
}
執行緒安全問題:有可能出現問題的三種情況:1,多執行緒,2有共享資料,3有多條語句操作共享資料。
原始碼:
class MyThread implements Runnable{
int num =100;
private String name;
public MyThread(){}
public MyThread(String name) {
super();
this.name
}
@Override
public void run() {
for(int i=0;i<200;i++){
synchronized (this) {
if(num>0){
System.out.println(Thread.currentThread().getName()+"發了"+num--+"禮物");
}}
}
}
}
public class Test4 {
public static void main(String[] args) {
MyThread my =new MyThread();
new Thread(my,"ddss").start();
new Thread(my,"sssa").start();
}
}
分析:這個是典型的多執行緒問題,使用了synchronized來鎖住程式碼塊。1,多執行緒:主程式中new了2個執行緒。2,有共享資料:執行緒處理了都是My的物件,而這個類是實現賣票的功能,有共同的資料。3,有多條語句操作共同資料,這是顯然的。
解決方法:除了用synchronized來鎖住程式碼塊以外,還可以用synchronized來修飾方法,把該方法鎖住。
當執行緒進該程式塊後,必須得全部執行完畢,其他執行緒才能執行,就不會出現搶佔問題和資料錯誤。