機器學習之邏輯迴歸
阿新 • • 發佈:2020-12-09
多執行緒
一、程序執行緒的區別:
- 程序是作業系統資源分配的基本單位,執行緒是CPU的基本排程單位。
- 一個程式執行後至少有一個程序。
- 一個程序至少包含一個執行緒。
- 程序間不能共享資料段地址,但同進程的執行緒之間可以。
二、執行緒的組成:
- CPU時間片:作業系統(OS)會為每個執行緒分配執行時間。
- 執行資料:
- 堆空間:儲存執行緒需使用的物件,多個執行緒可以共享堆中的物件。
- 棧空間:儲存執行緒需要使用的區域性變數,每個執行緒都擁有獨立的棧。
三、執行緒的特點:
- 執行緒搶佔式執行(效率高、可防止單一執行緒長時間獨佔CPU)。
- 在單核CPU中,巨集觀上同時執行,微觀上順序執行。
四、建立執行緒
- 繼承Thread類,重寫run方法。
- 實現Runnable介面
- 實現Callable介面
五、獲取和修改執行緒名稱
-
獲取執行緒ID和執行緒名稱
-
在Thread的子類中呼叫this.getId()或者this.getName()。只適合繼承Thread類
class MyThread extends Thread{ @Override public void run() { int sum=0; for (int i=0;i<=100;i++){ //this.getId()獲取執行緒ID,this.getName()獲取執行緒名稱 System.out.println("執行緒ID:"+this.getId()+"執行緒名稱:"+this.getName()+"子執行緒------"+i); } } }
-
使用Thread.currentThread().getId()和Thread.currentThread().getName()。可以不繼承Thread類
class MyThread extends Thread{ @Override public void run() { for (int i=0;i<=100;i++){ System.out.println("執行緒ID:"+Thread.currentThread().getId()+"執行緒名稱:"+Thread.currentThread().getName()+"子執行緒------"+i); } } }
-
-
修改執行緒名稱
-
呼叫執行緒物件的setName()方法。
//建立執行緒物件 MyThread myThread = new MyThread(); MyThread myThread1 = new MyThread(); //修改執行緒名稱 myThread.setName("QQ"); myThread1.setName("微信");
-
使用執行緒子類的構造方法賦值。
package com.sun.base.XianCheng; public class TestThread { public static void main(String[] args) { //建立執行緒物件 MyThread myThread = new MyThread("QQ"); MyThread myThread1 = new MyThread("微信"); ... /** * 執行緒類 */ class MyThread extends Thread{ public MyThread(){ } public MyThread(String name) { super(name); } ...
-
繼承Thread類--程式碼實現四個視窗各賣一百張票案例
package com.sun.base.XianCheng;
public class TestThread {
public static void main(String[] args) {
//建立執行緒物件
MyThread myThread = new MyThread("視窗1");
MyThread myThread1 = new MyThread("視窗2");
MyThread myThread2 = new MyThread("視窗3");
MyThread myThread3 = new MyThread("視窗4");
//啟動執行緒,不能run方法
myThread.start();
myThread1.start();
myThread2.start();
myThread3.start();
}
}
/**
* 賣票視窗類(執行緒類)
*/
class MyThread extends Thread{
private int ticket=100; //100張票
public MyThread(){
}
public MyThread(String name) {
super(name);
}
@Override
public void run() {
//買票功能
while (true){
if (ticket<0){
break;
}
System.out.println("執行緒ID:"+Thread.currentThread().getId()+"執行緒名稱:"+Thread.currentThread().getName()+"賣了第"+(100-ticket)+"張票");
ticket--;
}
}
}
實現Runnable介面
package com.sun.base.XianCheng;
public class TextRunnable {
public static void main(String[] args) {
//匿名內部類 建立可執行物件
Runnable runnable = new Runnable() {
@Override
public void run() {
for (int i=0;i<100;i++){
System.out.println(Thread.currentThread().getName()+"----"+i);
}
}
};
//建立執行緒物件
Thread thread = new Thread(runnable, "我的子執行緒");
//啟動執行緒
thread.start();
for (int i=0;i<50;i++){
System.out.println("主執行緒----"+i);
}
}
}
六、執行緒的方法
- 休眠(限期等待):public static void sleep(long millis) 當前執行緒主動休眠millis毫秒
public void run() {
for (int i=0;i<100;i++){
System.out.println(Thread.currentThread().getName()+"----"+i);
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
- 放棄:public static void yield() 當前執行緒主動放棄時間片,回到就緒狀態,競爭下一次時間片
public void run() {
for (int i=0;i<100;i++){
System.out.println(Thread.currentThread().getName()+"----"+i);
//主動放棄
Thread.yield();
}
}
-
加入(無限期等待):public final void join() 允許其他執行緒加入到當前執行緒中
- 在啟動執行緒之後,加入當前執行緒,並阻塞當前執行緒,直到加入執行緒執行完畢
-
優先順序
- 執行緒物件.setPriority();線上程啟動之前
- 執行緒優先順序為1-10,預設為5,優先順序越高,表示獲取CPU機會越多。
-
守護執行緒
- 執行緒物件.setDaemon(true);設定為守護執行緒。線上程啟動之前
- 執行緒有兩類:使用者執行緒(前臺執行緒)、守護執行緒(後臺執行緒)
- 如果程式中所有前臺執行緒都執行完畢了,後臺執行緒就會自動結束
- 垃圾回收器執行緒屬於守護執行緒
-
執行緒通訊
- 等待:public final void wait() / public final void wait(long timeout)
- 通知:public final void notify() / public final void notifyAll()
七、執行緒安全
-
同步方式
-
同步程式碼塊 synchronized(臨界資源物件){//對臨界資源物件加鎖
//程式碼(原子操作)} //每個物件都擁有一個互斥鎖標記,用來分配給執行緒。只有擁有物件互斥鎖標記的執行緒,才能進入對該物件加鎖的同步程式碼塊。
private Object obj =new Object(); @Override public void run() { while (true) { synchronized (obj) { if (ticket < 0) { break; } System.out.println(Thread.currentThread().getName() + "賣了第" + (100 - ticket) + "張票"); ticket--; } } }
-
同步方法 synchronized 返回值型別 方法名稱(形參列表){//對當前物件(this)加鎖
//程式碼(原子操作)}
//賣票方法 public synchronized boolean sale(){//鎖 this ;如果是靜態方法 鎖 Ticket.class if (ticket<0){ return false; } System.out.println(Thread.currentThread().getName() + "賣了第" + (100 - ticket) + "張票"); ticket--; return true; }
-