創(chuàng)建線程有兩種方式一種是繼承Thread類另一種是繼承Runnable接口實(shí)現(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)建一個(gè)類繼承Thread類,
2)改寫run()方法,
3)再對(duì)象.start()。
2.靜態(tài)代理方法實(shí)現(xiàn)(實(shí)現(xiàn)Runnable接口):由程序員創(chuàng)建或工具生成代理類的源碼,再編譯代理類。所謂靜態(tài)也就是在程序運(yùn)行前就已經(jīng)存在代理類的字節(jié)碼文件,代理類和委托類的關(guān)系在運(yùn)行前就確定了。
1)首先靜態(tài)代理包含了兩個(gè)角色:代理角色和真實(shí)(委托)角色,
2)上述兩個(gè)角色必需實(shí)現(xiàn)同一個(gè)接口,
3)代理角色要持有真實(shí)角色的引用,代理角色中要有方法供代理角色中的的真實(shí)角色指向之后生成的實(shí)例對(duì)象。代理角色里還有一些方法是委托方法
4)創(chuàng)建一個(gè)真實(shí)對(duì)象和一個(gè)代理對(duì)象,將真實(shí)對(duì)象賦給代理對(duì)象進(jìn)行操作,但是操作的還是真實(shí)對(duì)象自己。
推薦使用實(shí)現(xiàn)Runnable接口:避免單繼承,方便共享資源。
1>代理接口
/**
* 代理接口。處理給定名字的任務(wù)。
*/
public interface Subject {
/**
* 執(zhí)行給定名字的任務(wù)。
* @param taskName 任務(wù)名
*/
public void dealTask(String taskName);
}
2>委托類,具體處理業(yè)務(wù)。
/**
* 真正執(zhí)行任務(wù)的類,實(shí)現(xiàn)了代理接口。
*/
public class RealSubject implements Subject {
/**
* 執(zhí)行給定名字的任務(wù)。這里打印出任務(wù)名,并休眠500ms模擬任務(wù)執(zhí)行了很長(zhǎng)時(shí)間
* @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)代理類
/**
* 代理類,實(shí)現(xiàn)了代理接口。
*/
public class ProxySubject implements Subject {
//代理類持有一個(gè)委托類的對(duì)象引用
private Subject delegate;
public ProxySubject(Subject delegate) {
this.delegate = delegate;
}
/**
* 將請(qǐng)求分派給委托類執(zhí)行,記錄任務(wù)執(zhí)行前后的時(shí)間,時(shí)間差即為任務(wù)的處理時(shí)間
*
* @param taskName
*/
@Override
public void dealTask(String taskName) {
long stime = System.currentTimeMillis();
//將請(qǐng)求分派給委托類處理
delegate.dealTask(taskName);
long ftime = System.currentTimeMillis();
System.out.println("執(zhí)行任務(wù)耗時(shí)"+(ftime - stime)+"毫秒");
}
}
4>生成靜態(tài)代理類工廠
public class SubjectStaticFactory {
//客戶類調(diào)用此工廠方法獲得代理對(duì)象。
//對(duì)客戶類來說,其并不知道返回的是代理類對(duì)象還是委托類對(duì)象。
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.通過過實(shí)現(xiàn)Runnable接口實(shí)現(xiàn)靜態(tài)代理從而開啟多線程:
把Thread當(dāng)成代理類創(chuàng)建main和thread兩個(gè)線程
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);
}
}
}
委托類實(shí)現(xiàn)接口
public class MyThread implements Runnable{
public void run() {
for (int i = 0;i<10000;i++){
System.out.println("rua");
}
}
}