スレッドを作成する方法
-
Threadクラスを継承する
-
Threadクラスを継承し、runメソッドを書き換えて、スレッドクラスのinstance.start()メソッドを介してスレッドを開始します。
public class TestThread1 extends Thread{
@override
public void run(){
System.out.println("线程run方法!");
}
public static void main(String){
new TestThread1().start();
}
}
-
Runnableインターフェースを実装する
-
Runnableインターフェースを実装し、runメソッドを書き直して、**新しいスレッド(スレッドクラスインスタンス)からスレッドを開始します。start()**
-
このメソッドは、Javaの単一継承の制限を回避するために推奨されます
public class TestThread2 implements Runnable{
@Override
public void run() {
System.out.println("线程run方法!");
}
public static void main(String[] args) {
new Thread(new TestThread2()).start();
}
}
-
Callableインターフェースを実装する
-
Callableインターフェースを実装し、callメソッドを書き換え、callメソッドには戻り値があります
-
開始方法:
-
実行サービスを作成する
-
実行のために提出
-
結果を得る
-
サービスを閉じる
public class TestThread2 implements Callable{
@Override
public Boolean call() {
System.out.println("线程call方法!");
return true;
}
public static void main(String[] args) throws InterruptedException, ExecutionException {
TestThread2 t1 = new TestThread2();
TestThread2 t2 = new TestThread2();
TestThread2 t3 = new TestThread2();
//创建执行服务
ExecutorService ser = Executors.newFixedThreadPool(3);
//提交执行
Future<Boolean> r1 = ser.submit(t1);
Future<Boolean> r2 = ser.submit(t2);
Future<Boolean> r3 = ser.submit(t3);
//获取结果
boolean rs1 = r1.get();
boolean rs2 = r2.get();
boolean rs3 = r3.get();
//关闭服务
ser.shutdownNow();
}
スレッド同期
-
複数のスレッドが同時に同じリソースを操作し、スレッドは安全ではなく、変数値は無秩序です
-
ロック
-
キュー+ロック(同期)
-
同期されたデフォルトロックこれは、指定したロックオブジェクトを表示して変更できます。
1.同期修正メソッド、スレッドセーフメソッド
public class TestThreadSafe {
public static void main(String[] args) {
BuyTicket bt1 = new BuyTicket();
Thread thread1 = new Thread(bt1,"张三");
Thread thread2 = new Thread(bt1,"李四");
Thread thread3 = new Thread(bt1,"黄牛");
thread1.start();
thread2.start();
thread3.start();
}
}
class BuyTicket implements Runnable{
private int ticketNumber = 10;
private boolean flag = true;
@Override
public void run() {
while(flag) {
try {
buy();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
public synchronized void buy() throws InterruptedException {
//买票
if(ticketNumber <= 0){
System.out.println("票卖完了!");
flag = false;
return;
}
Thread.sleep(100);
//Thread.yield();
System.out.println(Thread.currentThread().getName() + "买到了一张票,还剩下"+(--ticketNumber) + "张票!");
}
}
2.変更された同期コードブロック、スレッドセーフコードブロック
public class TestThreadSafe {
public static void main(String[] args) {
BuyTicket bt1 = new BuyTicket();
Thread thread1 = new Thread(bt1,"张三");
Thread thread2 = new Thread(bt1,"李四");
Thread thread3 = new Thread(bt1,"黄牛");
thread1.start();
thread2.start();
thread3.start();
}
}
class BuyTicket implements Runnable{
private int ticketNumber = 10;
private boolean flag = true;
@Override
public void run() {
while(flag) {
System.out.println(Thread.currentThread().getName() + "准备买票" + flag);
try {
buy();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
public void buy() throws InterruptedException {
synchronized(this){
//买票
if(ticketNumber <= 0){
flag = false;
System.out.println("票卖完了!");
return;
}
Thread.sleep(100);
//Thread.yield();
System.out.println(Thread.currentThread().getName() + "买到了一张票,还剩下"+(--ticketNumber) + "张票!");
}
}
}
3. ReentrantLockを使用する
import java.util.concurrent.locks.ReentrantLock;
public class TestLock {
public static void main(String[] args) {
BuyTicket bt1 = new BuyTicket();
Thread thread1 = new Thread(bt1,"张三");
Thread thread2 = new Thread(bt1,"李四");
Thread thread3 = new Thread(bt1,"黄牛");
thread1.start();
thread2.start();
thread3.start();
}
}
class BuyTicket implements Runnable{
private int ticketNumber = 1000;
private boolean flag = true;
//定义可重复锁
private final ReentrantLock lock = new ReentrantLock();
@Override
public void run() {
while(flag) {
try {
buy();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
public void buy() throws InterruptedException {
lock.lock();
//买票
if(ticketNumber <= 0){
System.out.println("票卖完了!");
flag = false;
}else {
Thread.sleep(100);
//Thread.yield();
System.out.println(Thread.currentThread().getName() + "买到了一张票,还剩下"+(--ticketNumber) + "张票!");
}
lock.unlock();
}
}
-
デッドロック
-
3つ以上のオブジェクトロックの場合、各スレッドは互いに必要なリソースを占有します。デッドロックを形成します。
スレッドの状態
- 新入生のステータス(新規)
- 準備完了状態(開始)
- ブロッキング状態(スリープ、待機、同期ロック)
- 稼働状況
- デッドステートのスレッドオブジェクトがデッドステートに入ると、start()メソッドを再度呼び出して再開することはできません
Thread(Threadクラス)メソッド
-
setPriority(int newPriority)スレッドの優先度newPriorityを1から10に変更します。
-
static void sleep(long millis)は、スレッドロックオブジェクトを解放せずに、現在実行中のスレッドを指定されたミリ秒の間スリープさせます。
-
void join()スレッドをマージし、スレッドが終了するのを待ちます
-
static void yield()現在実行中のスレッドを一時停止し、他のスレッドを実行します
-
void interrupt()割り込みスレッド
-
boolean isAlive()は生きているスレッドです
デーモンスレッド
-
setDaemon(true):デーモンスレッドとして設定
-
スレッドはユーザースレッドとデーモンスレッドに分けられます
-
JVM仮想マシンは、ユーザースレッドが確実に実行されるようにします
-
JVM仮想マシンは、デーモンスレッドの実行が完了するのを待つ必要はありません。
eg:后台记录操作日志,监控内存,垃圾回收等待
やっと
こちらをご覧いただきありがとうございます。読んだ後、ご不明な点がありましたらコメント欄でお尋ねください。記事が役に立ったと思われる場合は、高く評価してください。Java関連の技術記事や業界情報を毎日共有します。記事を転送してください!