package lesson04; /** * Author: Gu Jiakai * Date: 2021/8/12 14:50 * FileName: TestPriority * Description: */ //测试线程的优先级 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);//MAX_PRIORITY t4.start(); t5.setPriority(8); t5.start(); t6.setPriority(7); t6.start(); } } class Mypriority implements Runnable{ @Override public void run() { System.out.println(Thread.currentThread().getName()+"--->"+Thread.currentThread().getPriority()); } }
package lesson04; /** * Author: Gu Jiakai * Date: 2021/8/12 15:11 * FileName: TestDaemon * Description: */ //测试守护线程 //上帝守护你 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("God Bless You!"); } } } //你 class You implements Runnable{ @Override public void run() { for (int i = 0; i < 36500; i++) { System.out.println("你一生都开心地活着!"); } System.out.println("======GoodBye,World!======"); } }
...
package synchronized_test; /** * Author: Gu Jiakai * Date: 2021/8/12 16:10 * FileName: UnsafeBuyTicket * Description: */ //不安全的买票 //线程不安全,有负数 public class UnsafeBuyTicket { public static void main(String[] args) { BuyTicket buyTicket = new BuyTicket(); new Thread(buyTicket,"我").start(); new Thread(buyTicket,"蔡伟").start(); new Thread(buyTicket,"黄牛党").start(); } } class BuyTicket implements Runnable{ //票 private int ticketNums=10; boolean flag=true;//外部停止方式 @Override public void run() { //买票 while(flag){ buy(); } } //synchronized 同步方法,锁的是this。 private synchronized void buy(){ //判断是否有票 if(ticketNums<=0){ flag=false; return; } //模拟延时 try { Thread.sleep(100); } catch (InterruptedException e) { e.printStackTrace(); } //买票 System.out.println(Thread.currentThread().getName()+"拿到"+ticketNums--); } }
package synchronized_test; /** * Author: Gu Jiakai * Date: 2021/8/12 16:25 * FileName: UnsafeBank * Description: */ //不安全的取钱 //两个人去银行取钱,账户 public class UnsafeBank { public static void main(String[] args) { //账户 Account account = new Account(1000,"结婚基金"); WithDrawing you = new WithDrawing(account,50,"蔡伟"); WithDrawing girlfriend = new WithDrawing(account,100,"蔡伟女友"); you.start(); girlfriend.start(); } } //账户 class Account{ int money;//余额 String name;//卡名 public Account(int money, String name) { this.money = money; this.name = name; } } class WithDrawing extends Thread{ Account account;//账户 //取了多少钱 int withdraw_money; //现在手里有多少钱 int now_money; public WithDrawing(Account account, int withdraw_money,String name) { super(name); this.account = account; this.withdraw_money = withdraw_money; } //取钱 //synchronized 默认锁的是this @Override public void run() { //锁的对象就是变化的量,,需要增删改的对象 synchronized (account){ //判断有没有钱 if(account.money-withdraw_money<0){ System.out.println(Thread.currentThread().getName()+"钱不够,取不了"); return; } //sleep可以放大问题的发生性。 try { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } //卡内余额=余额-你要取的钱 account.money=account.money-withdraw_money; //你手里的钱 now_money=now_money+withdraw_money; System.out.println(account.name+"余额为:"+account.money); //Thread.currentThread().getName()=this.getName() System.out.println(this.getName()+"手里的钱:"+now_money); } } }
package synchronized_test; import java.util.ArrayList; /** * Author: Gu Jiakai * Date: 2021/8/12 16:59 * FileName: UnsafeList * Description: */ //线程不安全的集合 public class UnsafeList { public static void main(String[] args) { ArrayList<String> list = new ArrayList<String>(); for (int i = 0; i < 10000; i++) { new Thread(()->{ synchronized (list){ list.add(Thread.currentThread().getName()); } }).start(); } try { Thread.sleep(3000); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println(list.size()); } }