簡單講解了關于多線程的一些應用:線程進程的概念區別,定義多線程,多線程之間的通信,線程的死鎖,以及線程的優先級。此類問題在Java面試當中經常觸及。
多線程.png
1.多線程的實踐:
package Thread;
public class Live implements Runnable{
public void run() {
for(int i = 1;i<=6;i++){
System.out.println("摳腳"+i+"次");
try {
Thread.sleep(200);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
package Thread;
public class Play extends Thread{
public void run(){
for(int i=1;i<=30;i++){
System.out.println("who打單機:第"+i+"局,輸了,玩的真菜!");
try {
Thread.sleep(50);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
package Thread;
/*
* 多線程同時執行,有兩種實現多線程的方法,一種是繼承類,一種是實現接口。
* 繼承: 繼承Thread的話,該子類應重寫 Thread 類的 run 方法。接下來可以分配并啟動該子類的實例
* 實現接口:聲明實現 Runnable 接口的類,該類然后實現 run 方法。
* 然后可以分配該類的實例,在創建 Thread 時作為一個參數來傳遞并啟動。
* */
public class Thread_jichu {
public static void print(){
for(int i=1;i<=50;i++){
System.out.println("who看校花的貼身高手:第"+i+"集,看的挺嗨的!");
try {
Thread.sleep(50);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
public static void main(String[] args) {
Thread t = new Play();
Live l = new Live();
Thread t1 = new Thread(l);
t1.start();
t.start();
print();
}
}
2.線程安全和同步:
package Thread;
public class Synchronized_tongbu {
public static void main(String[] args) {
BankAccount account = new BankAccount();
Thread husband = new BankThread(account);
Thread wife = new BankThread(account);
husband.start();
wife.start();
}
}
class BankAccount{
private double balance = 1000;
public boolean depasit(double newAdd){
if(newAdd <=0){
return false;
}else{
synchronized(this){//鎖方法和鎖局域代碼
System.out.println("當前余額為:"+balance);
try {
Thread.sleep(5);
} catch (InterruptedException e) {
e.printStackTrace();
}
balance = balance + newAdd;
}
System.out.println("新的余額為:" + balance);
}
return true;
}
}
class BankThread extends Thread{
private BankAccount bankAccount;
public BankThread(BankAccount account){
bankAccount = account;
}
public void run(){
bankAccount.depasit(200);
}
}
死鎖
package Thread;
/*
* 由于加鎖,所以在取資源時某一方沒有使用完不得進入該空間。
*
* */
public class DeadLock {
public static void main(String[] args) {
Object object1 = new Object();
Object object2 = new Object();
Thread ta = new A(object1, object2);
Thread tb = new B(object1, object2);
ta.start();
tb.start();
}
}
class A extends Thread {
Object object1;
Object object2;
public A(Object object1, Object object2) {
this.object1 = object1;
this.object2 = object2;
}
public void run() {
synchronized (object1) {
System.out.println("A取到了object1");
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
synchronized(object2){
System.out.println("A拿到了object1和object2");
}
}
}
}
class B extends Thread {
public Object object1;
public Object object2;
public B(Object object1, Object object2) {
this.object1 = object1;
this.object2 = object2;
}
public void run() {
synchronized (object2) {
System.out.println("B取到了object1");
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
synchronized(object1){
System.out.println("B拿到了object1和object2");
}
}
}
}
如上代碼會出現死鎖,未能A B都未能取到所需,將B run方法中object2 object1調換即可。取得順序相同很慶幸解決了問題。