Rumah  >  Artikel  >  Java  >  Status benang Java dan analisis kaedah biasa dan contoh

Status benang Java dan analisis kaedah biasa dan contoh

王林
王林ke hadapan
2023-04-21 13:04:081416semak imbas

Anda boleh mendapatkan status utas melalui kaedah Thread.getState (terdapat 6 keadaan thread secara keseluruhan)

BARU (baru) baharu: belum bermula

BOLEH DIJALANKAN ( status runnable) runnable: sedang dijalankan Berjalan dalam JVM; atau menunggu sumber lain sistem pengendalian (seperti pemproses)

//Sesetengah bahasa pengaturcaraan akan membahagikan RUNNABLE kepada 2 situasi
//1.running
/ /2.ready
//Dua jenis di atas dalam Java ialah RUNNABLE

BLOCKED (blocked state) blocked: waiting for monitor lock (internal lock)

MENUNGGU (Keadaan menunggu) menunggu: Menunggu urutan lain

untuk memanggil kaedah berikut akan berada dalam keadaan menunggu

Objek.tunggu tanpa nilai tamat masa

Thread.join tanpa nilai tamat masa

LockSupport.park

//Akan diperkenalkan secara terperinci kemudian

TIMED_WAITING (keadaan menunggu masa) timed_waiting

Panggil kaedah berikut akan berada dalam keadaan menunggu masa

Thread.sleep

Object.wait dengan nilai tamat masa

Thread.join dengan nilai tamat masa

LockSupport.parkNanos

LockSupport>parkUnti

//Akan diperkenalkan secara terperinci kemudian

TAMAT (status penamatan): Pelaksanaan selesai

Beberapa contoh:

public class Main {
	public static void main(String[] a) {
		Thread dangqian = Thread.currentThread();//获取主线程
		System.out.println(dangqian.getState());//输出RUNNABLE
		//表示主线程正处于RUNNABLE状态
		
		Thread tj = new Thread();//新建1个线程
		System.out.println(tj.getState());//输出NEW
		
		Thread tj1 = new Thread(new Runnable() {
			@Override
			public void run() {
				System.out.println("ACM");
			}
		});
		tj1.start();
		//启动执行完run方法后线程终止 此时处于TERMINATED状态
	}
}

pengenalan gangguan tidur

Anda boleh menjeda urutan semasa melalui kaedah Thread.sleep dan masukkan keadaan MENUNGGU

Semasa tempoh jeda, jika kaedah gangguan objek thread dipanggil untuk mengganggu thread, pengecualian java.lang.InterruptedException akan dilemparkan

Contoh (anotasi) pengenalan lebih jelas:

public class Main {
	public static void main(String[] a) {
		Thread tj = new Thread(new Runnable() {
			@Override
			public void run() {
				System.out.println("1");
				try {
					Thread.sleep(3000);//sleep是静态方法,所以通过类名来调用;让线程睡3s
				}catch (InterruptedException e) {
					e.printStackTrace();
				}
				System.out.println("2");
			}
		});
		tj.start();
		//因为是多线程,在执行tj线程时,主线程依然往下走
		try {
			Thread.sleep(1000);//让主线程睡1s
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
		System.out.println("3");
		//由于tj线程睡得较久,所以先打印3,再打印2
		tj.interrupt();//中断此线程,但实际上只是给线程设置一个中断标志,线程仍会执行;在这里用于触发异常
	}
}

Output:

1
3
2

join isAlive Memperkenalkan kaedah

A.join: Selepas thread A selesai pelaksanaan, thread semasa terus ke melaksanakan tugas. Anda boleh lulus parameter untuk menentukan masa menunggu maksimum

Kaedah A.isAlive: Semak sama ada benang A masih hidup

Instance:

public class Main {
	public static void main(String[] a) {
		Thread tj = new Thread(new Runnable() {
			@Override
			public void run() {
				System.out.println("1");
				try {
					Thread.sleep(3000);//sleep是静态方法,所以通过类名来调用;让线程睡3s
				}catch (InterruptedException e) {
					e.printStackTrace();
				}
				System.out.println("2");
			}
		});
		tj.start();
		System.out.println(tj.isAlive());//此时3s未过,tj线程仍在执行;所以输出true
		try {
			tj.join();//等tj线程执行完毕再往下执行
			//tj.join(1000); 等待tj线程1s再往下执行
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
		System.out.println("3");
	    System.out.println(tj.getState());
	    System.out.println(tj.isAlive());//tj线程已执行完毕;所以输出false
	}
}

Output:

benar
1
2
3
DITAMATKAN
salah

Atas ialah kandungan terperinci Status benang Java dan analisis kaedah biasa dan contoh. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Artikel ini dikembalikan pada:yisu.com. Jika ada pelanggaran, sila hubungi admin@php.cn Padam