方式一:
在java中創建線程的一種方式是通過Thread來實現的.Thread有很多個構造器來創建一個線程(Thread)實例:
public class TestThread extends Thread{
public void run(){
for(int i=0;i<100;i++)
System.out.println("Count:"+i);
}
public static void main(String[] args){
TestThread tt=new TestThread();
tt.start();
}
}
方式二:
通過實現Runnable接口並實現接口中這義的唯一方法run(),可以創建一個線程.
public class RunnableThread implements Runnable{
public void run(){
for(int k=0;k<100;k++)
System.out.println("Count:"+k);
}
public static void main(String[] args){
RunnableThread rt=new RunnableThread ();
Thread t=new Thread(rt);
rt.start();
}
}
具體運用:(開的流程)
package com.sodo.crm.action;
import java.io.File;
import com.sodo.core.utils.Url2Jpg;
public class CrmPictureThread extends Thread {
public CrmPictureThread(String url,String userId,String reportAnnualReportId,File file,String str){
this.url=url;
this.userId=userId;
this.reportAnnualReportId=reportAnnualReportId;
this.file=file;
this.str=str;
}
public CrmPictureThread(String url,String userId,String reportAnnualReportId,String concluseionid,File file,String str){
this.url=url;
this.userId=userId;
this.reportAnnualReportId=reportAnnualReportId;
this.file=file;
this.str=str;
this.concluseionid=concluseionid;
}
public String concluseionid;
public String getConcluseionid() {
return concluseionid;
}
public void setConcluseionid(String concluseionid) {
this.concluseionid = concluseionid;
}
public String str;
public String getStr() {
return str;
}
public void setStr(String str) {
this.str = str;
}
public File file;
public File getFile() {
return file;
}
public void setFile(File file) {
this.file = file;
}
private Object obj;
public Object getObj() {
return obj;
}
public void setObj(Object obj) {
this.obj = obj;
}
private String url;
private String userId;
public String getUserId() {
return userId;
}
public void setUserId(String userId) {
this.userId = userId;
}
private String reportAnnualReportId;
public String getUrl() {
return url;
}
public void setUrl(String url) {
this.url = url;
}
public String getReportAnnualReportId() {
return reportAnnualReportId;
}
public void setReportAnnualReportId(String reportAnnualReportId) {
this.reportAnnualReportId = reportAnnualReportId;
}
public void run(){
String url = this.getUrl();
String reportAnnualReportId=getReportAnnualReportId();
String filePath = file+this.userId+reportAnnualReportId+".jpg";
File files = new File(this.file+this.userId+reportAnnualReportId+".jpg");
if(files.exists()){
files.delete();
}
if(this.str.equals("LDZCSB")){
String[] pictureUrl=url.split("_");
String newPicUrl=pictureUrl[0]+"_getSerfAnnualReportId.do?serfAnnualReportId="+reportAnnualReportId;
try {
new Url2Jpg(newPicUrl, new File(filePath)).producePic();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}else if(this.str.equals("ZTZRQKZCB")){
String[] pictureUrl=url.split("/");
String newPicUrl=pictureUrl[0]+"//"+pictureUrl[2]+"/"+pictureUrl[3]+"/"+pictureUrl[4]+"/"+"psel_showDate.do?id="+reportAnnualReportId;
try {
new Url2Jpg(newPicUrl, new File(filePath)).producePic();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
(調用流程)
public String showPic()throws Exception{
User user=(User)contextPvd.getSessionAttr("_userInfo");
HttpServletRequest request=contextPvd.getRequest();
String str="LDZCSB";
File file = new File(request.getSession().getServletContext().getRealPath("resource/pic")+File.separator+str);
Thread t = new CrmPictureThread(url,user.getAdOrgId().toString(),reportAnnualReportId,file,str);
request.setAttribute("reportAnnualReportId", reportAnnualReportId);
t.start();
return list();
}
兩種方式的區別:
● 使用Runnable接口
可以將CPU,代碼和數據分開,形成清晰的模型;
還可以從其他類繼承;
保持程序風格的一致性.
● 直接繼承Thread類
不能再從其他類繼承;
編寫簡單,可以直接操縱線程,無需使用Thread,currentThread().