創(chuàng)建線程有兩種方式一種是繼承Thread類另一種是繼承Runnable接口實現(xiàn)靜態(tài)代理。
1.繼承Thread方式:
public class MyThread extends Thread {
@Override
public void run(){
super.run();
System.out.println("MyThread");
}
}
public class Run {
public static void main(String[] args) {
MyThread myThread = new MyThread();
myThread.start();
System.out.println("運(yùn)行結(jié)束");
}
}
1)創(chuàng)建一個類繼承Thread類,
2)改寫run()方法颓帝,
3)再對象.start()疤苹。
2.靜態(tài)代理方法實現(xiàn)(實現(xiàn)Runnable接口):由程序員創(chuàng)建或工具生成代理類的源碼汰翠,再編譯代理類。所謂靜態(tài)也就是在程序運(yùn)行前就已經(jīng)存在代理類的字節(jié)碼文件叙身,代理類和委托類的關(guān)系在運(yùn)行前就確定了。
1)首先靜態(tài)代理包含了兩個角色:代理角色和真實(委托)角色硫狞,
2)上述兩個角色必需實現(xiàn)同一個接口信轿,
3)代理角色要持有真實角色的引用,代理角色中要有方法供代理角色中的的真實角色指向之后生成的實例對象。代理角色里還有一些方法是委托方法
4)創(chuàng)建一個真實對象和一個代理對象残吩,將真實對象賦給代理對象進(jìn)行操作财忽,但是操作的還是真實對象自己。
推薦使用實現(xiàn)Runnable接口:避免單繼承泣侮,方便共享資源定罢。
1>代理接口
/**
* 代理接口。處理給定名字的任務(wù)旁瘫。
*/
public interface Subject {
/**
* 執(zhí)行給定名字的任務(wù)祖凫。
* @param taskName 任務(wù)名
*/
public void dealTask(String taskName);
}
2>委托類,具體處理業(yè)務(wù)酬凳。
/**
* 真正執(zhí)行任務(wù)的類惠况,實現(xiàn)了代理接口。
*/
public class RealSubject implements Subject {
/**
* 執(zhí)行給定名字的任務(wù)宁仔。這里打印出任務(wù)名稠屠,并休眠500ms模擬任務(wù)執(zhí)行了很長時間
* @param taskName
*/
@Override
public void dealTask(String taskName) {
System.out.println("正在執(zhí)行任務(wù):"+taskName);
try {
Thread.sleep(500);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
3>靜態(tài)代理類
/**
* 代理類,實現(xiàn)了代理接口翎苫。
*/
public class ProxySubject implements Subject {
//代理類持有一個委托類的對象引用
private Subject delegate;
public ProxySubject(Subject delegate) {
this.delegate = delegate;
}
/**
* 將請求分派給委托類執(zhí)行权埠,記錄任務(wù)執(zhí)行前后的時間,時間差即為任務(wù)的處理時間
*
* @param taskName
*/
@Override
public void dealTask(String taskName) {
long stime = System.currentTimeMillis();
//將請求分派給委托類處理
delegate.dealTask(taskName);
long ftime = System.currentTimeMillis();
System.out.println("執(zhí)行任務(wù)耗時"+(ftime - stime)+"毫秒");
}
}
4>生成靜態(tài)代理類工廠
public class SubjectStaticFactory {
//客戶類調(diào)用此工廠方法獲得代理對象煎谍。
//對客戶類來說攘蔽,其并不知道返回的是代理類對象還是委托類對象。
public static Subject getInstance(){
return new ProxySubject(new RealSubject());
}
}
5>客戶類
public class Client1 {
public static void main(String[] args) {
Subject proxy = SubjectStaticFactory.getInstance();
proxy.dealTask("DBQueryTask");
}
}
3.通過過實現(xiàn)Runnable接口實現(xiàn)靜態(tài)代理從而開啟多線程:
把Thread當(dāng)成代理類創(chuàng)建main和thread兩個線程
public class Run {
public static void main(String[] args) {
MyThread myThread = new MyThread();
Thread thread = new Thread(myThread);
thread.start();
for (int i =0;i<10000;i++){
System.out.println(i);
}
}
}
委托類實現(xiàn)接口
public class MyThread implements Runnable{
public void run() {
for (int i = 0;i<10000;i++){
System.out.println("rua");
}
}
}