多线程

基本的概念

 

继承Thread类和Runnable接口对比

 

Lambda表达式

 

 

 

线程状态

 

 

 

 

package com.chen.State;

//观察测试线程的状态
public class TestState {
public static void main(String[] args) throws InterruptedException {
Thread thread = new Thread(()->{
for (int i = 0; i < 5; i++) {
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
System.out.println("///////");
});


//观察状态
Thread.State state = thread.getState();
System.out.println(state); //NEW


//观察启动后
thread.start();//启动线程
state = thread.getState();
System.out.println(state);//RUN


while (state != Thread.State.TERMINATED ){ //只要线程不终止,就一直输出状态
Thread.sleep(100);
state = thread.getState();//更新线程状态
System.out.println(state);//输出状态
}

}
}

 

 线程优先级

package com.chen.State;

//测试程序的优先级
public class TestPriority {
public static void main(String[] args) {
//主线程默认优先级
System.out.println(Thread.currentThread().getName()+"-->"+Thread.currentThread().getPriority());
MyPriority myPriority = new MyPriority();

Thread t1 = new Thread(myPriority);
Thread t2 = new Thread(myPriority);
Thread t3 = new Thread(myPriority);
Thread t4 = new Thread(myPriority);
Thread t5 = new Thread(myPriority);
Thread t6 = new Thread(myPriority);

//先设置优先级,再启动
t1.start();

t2.setPriority(1);
t2.start();

t3.setPriority(4);
t3.start();

t4.setPriority(Thread.MAX_PRIORITY);
t4.start();



}
}

class MyPriority implements Runnable{
@Override
public void run() {
System.out.println(Thread.currentThread().getName()+"-->"+Thread.currentThread().getPriority());
}
}

 

 守护线程

package com.chen.State;

//测试守护线程
//上帝守护你
public class TestDaemon {
public static void main(String[] args) {
God god = new God();
You you = new You();

Thread thread = new Thread(god);
thread.setDaemon(true); //默认是false表示用户线程,正常的线程都是用户线程
thread.start();

new Thread(you).start();//你 用户线程启动...


}
}


//上帝
class God implements Runnable{
@Override
public void run() {
while (true){
System.out.println("上帝保佑着你");
}
}
}

//你
class You implements Runnable{
@Override
public void run() {
for (int i = 0; i < 36500; i++) {
System.out.println("你一生都开心地活着");
}
System.out.println("========goodbye!world==========");
}
}


同步方法,同步块

 

 

package com.chen.syn;

//不安全的取钱
//两个人去银行取钱,账户
public class UnsafeBank {
public static void main(String[] args) {
//账户
Account account = new Account(100,"结婚基金");

Drawing you = new Drawing(account,50,"你");
Drawing girlFriend = new Drawing(account,100,"girlFriend");

you.start();
girlFriend.start();
}
}


//账户
class Account{
int money;//余额
String name;//卡名

public Account(int money, String name) {
this.money = money;
this.name = name;
}
}

//银行:模拟取款
class Drawing extends Thread{
Account account;//账户
//取了多少钱
int drawingMoney;
//现在手里有多少钱
int nowMoney;

public Drawing(Account account,int drawingMoney,String name){
super(name);
this.account = account;
this.drawingMoney = drawingMoney;

}

@Override
public void run() {
synchronized (account){
//判断有没有钱
if (account.money-drawingMoney<0){
System.out.println(Thread.currentThread().getName()+"钱不够,取不了");
return;
}
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
account.money = account.money - drawingMoney;
nowMoney = nowMoney + drawingMoney;

System.out.println(account.name+"余额为"+account.money);
//Thread.currentThread().getName()=this.getName()

System.out.println(this.getName()+"手里的钱"+nowMoney);
}

}
}

 

 

synchronized与Lock的对比

 

 

 

posted @ 2022-06-21 23:59  蜗牛+1  阅读(18)  评论(0编辑  收藏  举报