1. 程式人生 > 實用技巧 >機器學習之邏輯迴歸

機器學習之邏輯迴歸

多執行緒

一、程序執行緒的區別:

  • 程序是作業系統資源分配的基本單位,執行緒是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;
          }