天天看點

java多線程之線程建立(一)

一、普通方法調用與多線程

java多線程之線程建立(一)

二、程式,程序及線程

程式:是指令和資料的有序集合,其本身沒有任何運作的含義,是一個靜态的概念。

程序:是程式的一次執行過程,是一個動态的概念。是系統資源配置設定的機關。

線程:通常在一個程序中可以包含若幹個線程,一個程序至少包含一個線程。線程是CPU排程和執行的基本機關。

三、線程建立

java多線程之線程建立(一)

1.建立線程的第一種方式

(1)自定義線程類繼承Thread類

(2)重寫run()方法,編寫線程執行體

(3)建立線程對象,調用start()方法啟動線程

package com.atguigu.demo01;

//建立線程方式一:繼承Thread類,重寫 run方法,調用start開啟線程
//總結:線程開啟不一定會立即執行,由cpu排程執行
public class TestThread extends Thread {

    @Override
    public void run() {
        for(int i=1;i<=10;i++){
            System.out.println("線程:"+i);
        }
    }

    //主線程
    public static void main(String[] args) {
        TestThread testThread=new TestThread();
        //testThread.start();兩個線程并發執行
        testThread.run();//先執行run方法

        for(int i=1;i<=10;i++){
            System.out.println("主線程:"+i);
        }
    }
}

           

檔案下載下傳案例:

package com.atguigu.demo02;

import org.apache.commons.io.FileUtils;

import java.io.File;
import java.io.IOException;
import java.net.URL;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;

public class TestThread extends Thread {
    private String url;
    private String name;

    public TestThread(String url, String name) {
        this.url = url;
        this.name = name;
    }

    public void run()  {
        WebDownLoader webDownLoader = new WebDownLoader();
        webDownLoader.downLoader(url, name);
        System.out.println("下載下傳了圖檔,名為:" + name);
    }

    public static void main(String[] args) throws Exception {
        TestThread t1 = new TestThread("http://bos.pgzs.com/rbpiczy/Wallpaper/2012/1/6/aeae710d55ed4afab8a5993d457634bc-2.jpg", "cat1.jpg");
        TestThread t2 = new TestThread("http://g.hiphotos.baidu.com/zhidao/pic/item/8435e5dde71190efc8f16ea9cd1b9d16fdfa60ba.jpg", "cat2.jpg");
        TestThread t3 = new TestThread("http://www.chabeichong.com/images/2014/07/11-2347573.jpg", "cat3.jpg");

  	   t1.start();
       t2.start();
       t3.start();
       
       //實作runnale接口時的啟動方式
      /* new Thread(t1).start();
       new Thread(t2).start();
       new Thread(t3).start();*/
    }
}

//下載下傳器
class WebDownLoader{
    //下載下傳方法
    public void downLoader(String url,String name){
        try {
            FileUtils.copyURLToFile(new URL(url),new File(name));
        } catch (IOException e) {
            e.printStackTrace();
            System.out.println("檔案io異常");
        }
    }
}

           

2.建立線程的第二種方式

(1)自定義線程類實作Runnable接口

(2)實作run()方法,編寫線程執行體

(3)建立線程對象,調用start()方法啟動線程

package com.atguigu.demo01;

//建立線程的第二種方式
public class TestThread2 implements Runnable {
    public void run() {
        for(int i=1;i<=20;i++){
            System.out.println("run方法執行了:"+i);
        }
    }

    public static void main(String[] args) {
        TestThread2 thread2=new TestThread2();
        new Thread(thread2).start();
        for(int i=1;i<=20;i++){
            System.out.println("main方法執行了:"+i);
        }
    }
}

           
java多線程之線程建立(一)

多個線程同時操作同一個對象,會出現線程安全問題,如下代碼所示:

package com.atguigu.demo01;

//多個線程同時使用一個對象:存線上程安全問題
public class TestThread3 implements Runnable {
    private int ticket=10;

    public void run() {
        while (true){
            if(ticket<0){
                break;
            }
            try {
                Thread.sleep(200);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            System.out.println(Thread.currentThread().getName()+"拿到了第"+ticket--+"張票");
        }
    }

    public static void main(String[] args) {
        TestThread3 thread2=new TestThread3();
        new Thread(thread2,"張三").start();
        new Thread(thread2,"李四").start();
        new Thread(thread2,"王五").start();
}
}
           

3.建立線程的第三種方式

java多線程之線程建立(一)
package com.atguigu.demo02;

import org.apache.commons.io.FileUtils;

import java.io.File;
import java.io.IOException;
import java.net.URL;
import java.util.concurrent.Callable;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;

public class TestThread implements Callable<Boolean> {
    private String url;
    private String name;

    public TestThread(String url, String name) {
        this.url = url;
        this.name = name;
    }

    public Boolean call() throws Exception {
        WebDownLoader webDownLoader = new WebDownLoader();
        webDownLoader.downLoader(url, name);
        System.out.println("下載下傳了圖檔,名為:" + name);
        return true;
    }

    public static void main(String[] args) throws Exception {
        TestThread t1 = new TestThread("http://bos.pgzs.com/rbpiczy/Wallpaper/2012/1/6/aeae710d55ed4afab8a5993d457634bc-2.jpg", "cat1.jpg");
        TestThread t2 = new TestThread("http://g.hiphotos.baidu.com/zhidao/pic/item/8435e5dde71190efc8f16ea9cd1b9d16fdfa60ba.jpg", "cat2.jpg");
        TestThread t3 = new TestThread("http://www.chabeichong.com/images/2014/07/11-2347573.jpg", "cat3.jpg");

        //建立執行服務
        ExecutorService service= Executors.newFixedThreadPool(3);
        //送出執行
        Future<Boolean> f1= (Future<Boolean>) service.submit(t1);
        Future<Boolean> f2= (Future<Boolean>) service.submit(t2);
        Future<Boolean> f3= (Future<Boolean>) service.submit(t3);

        //擷取結果
        Boolean b1 = f1.get();
        Boolean b2 = f2.get();
        Boolean b3 = f3.get();

        //關閉服務
        service.shutdown();
    }
}

//下載下傳器
class WebDownLoader{
    //下載下傳方法
    public void downLoader(String url,String name){
        try {
            FileUtils.copyURLToFile(new URL(url),new File(name));
        } catch (IOException e) {
            e.printStackTrace();
            System.out.println("檔案io異常");
        }
    }
}