Java自学-多线程(3)
2021/8/12 17:36:06
本文主要是介绍Java自学-多线程(3),对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
Java自学-多线程(3)
1、线程的优先级
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()); } }
2、守护线程
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!======"); } }
3、线程同步机制
4、三大不安全案例
...
5、同步方法及同步块
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()); } }
这篇关于Java自学-多线程(3)的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-07-04TiDB 资源管控的对撞测试以及最佳实践架构
- 2024-07-03万字长文聊聊Web3的组成架构
- 2024-07-02springboot项目无法注册到nacos-icode9专业技术文章分享
- 2024-06-26结对编程到底难不难?答案在这里
- 2024-06-19《2023版Java工程师》课程升级公告
- 2024-06-15matplotlib作图不显示3D图,怎么办?
- 2024-06-1503-Loki 日志监控
- 2024-06-1504-让LLM理解知识 -Prompt
- 2024-06-05做软件测试需要懂代码吗?
- 2024-06-0514-ShardingSphere的分布式主键实现