1. 程式人生 > >鎖和多線程:線程創建3種方式(一)

鎖和多線程:線程創建3種方式(一)

row package itl osi optimize i++ clas all art

線程 鎖Synchronized

  • 1.線程創建
  • 2.線程安全

搞明白 線程 多線程系列

1.線程創建

線程創建常見的三種方式:

  1. 繼承Thread類

  2. 實現Runnable接口

  3. 實現Callable接口

第三種方式有異步調用效果,類似js中的ajax可以接收返回值,其余兩種不能.

package thread;

import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;
import
java.util.concurrent.FutureTask; /** * @Author lyf * @Date 2018/11/17 0017 13:38 */ public class MyThread { public static void main(String[] args) throws ExecutionException, InterruptedException { // 繼承Thread類 new Thread01("線程1").start(); // 實現Runnable接口 new Thread(new Thread02(), "線程2"
).start(); // 實現Callable接口 FutureTask<String> futureTask = new FutureTask<>(new Thread03()); futureTask.run(); while (futureTask.isDone()) { // 判斷線程是否運行結束 System.out.println("結果: " + futureTask.get());// 獲取結果 return; } } } class Thread01 extends Thread
{ public Thread01(String name) { super(name); } @Override public void run() { System.out.println(Thread.currentThread().getName() + "執行..."); } } class Thread02 implements Runnable { @Override public void run() { System.out.println(Thread.currentThread().getName() + "執行..."); } } class Thread03 implements Callable<String> { @Override public String call() throws Exception { Thread.sleep(3000); System.out.println(Thread.currentThread().getName() + "執行..."); return "hello"; } }

2.線程安全

多線程下訪問數據會有線程安全問題.比如買火車票,只有10張票20人買,那就要確保不能賣重,不能多賣.看下面例子:

package thread;

/**
 * @Author lyf
 * @Date 2018/11/17 0017 14:13
 */
public class Ticket {
  private int num = 10;

  public void buy() {
    if (num > 0) {
      try {
        Thread.sleep((long) (Math.random() * 100));
      } catch (InterruptedException e) {
        e.printStackTrace();
      }
      System.out.println("搶到第" + num-- + "張票...");
    } else {
      System.out.println("票已售罄...");
    }
  }

  public static void main(String[] args) {
    final Ticket ticket = new Ticket();
    for (int i = 0; i < 200; i++) {
      new Thread(() -> { ticket.buy(); }).start();
    }
  }
}

技術分享圖片

多線程操作下,就會出現多賣的情況.如果要解決,可以通過加鎖synchronized方式來實現.把上邊的代碼修改如下:

public synchronized void buy() {
  ...
}

技術分享圖片

可以保證不存在多賣情況.

鎖和多線程:線程創建3種方式(一)