java創建線程的兩個方法

方式一:

    在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().

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章