1. 程式人生 > >這些執行緒你可能不知道哦

這些執行緒你可能不知道哦

java中的多執行緒

  • 程式

    • 檔案

  • 程序

  • 執行緒

    • cpu排程的最小單位

    • 一個程序中至少有一個執行緒,如果只有一個執行緒,則這個執行緒就是主執行緒(main執行緒)

Java中執行緒的建立

 

  • 繼承自Thread類

  • 實現Runnable介面

執行緒安全性問題:

產生的原因

​ 多個執行緒物件同時訪問同一個全域性變數

如何解決:

加鎖(同步鎖)

加鎖方式:

  • 同步程式碼塊

    • synchronized

  • 同步方法

    • 宣告方法時新增synchronized

  • 加鎖的物件

    • 保證鎖物件的唯一

 

執行緒池的介紹

  • 池化技術

    • c3p0 dbcp ...

    • 執行緒池

  • 執行緒池的衍生

    • 頻繁的建立執行緒物件和多個執行緒之間進行上下文切換,是非常耗費時間和資源的,所以jdk1.5中提出了執行緒池技術

  • 使用執行緒池

    ​ Executor

執行緒池的建立

建立固定大小容量的執行緒池(**)

ExecutorService pool = Executors.newFixedThreadPool(2);
Runnable task = new Runnable() {
    @Override
    public void run() {
        while (true) {
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            System.out.println(Thread.currentThread().getName());
        }
    }
};
pool.execute(task);
pool.execute(task);
pool.execute(task);//執行緒池的帶下只有兩個   現在這個任務在其等待佇列中排隊等候

**建立可變大小的執行緒池

ExecutorService pool = Executors.newCachedThreadPool();
Runnable task = new Runnable() {
    @Override
    public void run() {
        while (true) {
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            System.out.println(Thread.currentThread().getName());
        }
    }
};
pool.execute(task);
pool.execute(task);
pool.execute(task);

**建立獨立任務的執行緒

ExecutorService pool = Executors.newSingleThreadExecutor();
Runnable task = new Runnable() {
    @Override
    public void run() {
        while (true) {
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            System.out.println(Thread.currentThread().getName());
        }
    }
};
pool.execute(task);
pool.execute(task);
pool.execute(task);

**建立可排程的執行緒

ScheduledExecutorService threadPool = Executors.newScheduledThreadPool(2);
Runnable task = new Runnable() {
@Override
public void run() {
while (true) {
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName());
}
}
};
threadPool.schedule(task, 2000, TimeUnit.MILLISECONDS);