鎖和多線程:線程創建3種方式(一)
阿新 • • 發佈:2018-11-21
row package itl osi optimize i++ clas all art
線程 鎖Synchronized
可以保證不存在多賣情況.
- 1.線程創建
- 2.線程安全
搞明白 線程
鎖
和多線程
系列
1.線程創建
線程創建常見的三種方式:
-
繼承Thread類
-
實現Runnable接口
-
實現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種方式(一)