Java自学代码--- 简单的线程同步和交互
Posted 老唐的编程笔记
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java自学代码--- 简单的线程同步和交互相关的知识,希望对你有一定的参考价值。
package Thread_test; import charactor.hero_sycn_2; //代码含义:逐渐减少英雄hp,如果英雄hp为0,就等待英雄恢复到大于0之后再继续减少到0, //展示了线程同步和wait和notify进行线程交互 public class test_1 { public static void main(String[] args) { hero_sycn_2 hero_1 = new hero_sycn_2("hero 1",30); hero_sycn_2 hero_2 = new hero_sycn_2("hero 2",30); Thread t1= new Thread() { public void run() { for (int i = 0;i < 5;i++) { hero_1.hurt(hero_2); } } }; Thread t2= new Thread() { public void run() { for (int i = 0;i < 5;i++) { try { Thread.sleep(10); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } hero_1.recover(hero_2); } } }; t1.start(); t2.start(); } }
package charactor; public class hero_sycn_2 { public String name; public int hp; public hero_sycn_2(String name,int hp) { this.hp = hp; this.name = name; } public synchronized void hurt(hero_sycn_2 h) { try { //为了表示攻击需要时间,每次攻击暂停500毫秒(0.5秒) Thread.sleep(500); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } if (h.hp > 0) { h.hp -= 10; System.out.println("hurt -- hp : " + h.hp); } else { try { this.wait(); h.hp -= 10; System.out.println("hurt -- hp : " + h.hp); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } public synchronized void recover(hero_sycn_2 h) { try { Thread.sleep(500); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } h.hp += 10; System.out.println("recover -- hp : " + h.hp); this.notify(); } }
这是输出,可以看到,每次hp到了0的时候都会暂停,等待生命恢复到0以上再继续扣。(之所以hurt先执行是因为类方法被同步化了,所以hurt操作的时候recover不能动,除非hurt被wait了。
hurt -- hp : 20 hurt -- hp : 10 hurt -- hp : 0 recover -- hp : 10 hurt -- hp : 0 recover -- hp : 10 hurt -- hp : 0 recover -- hp : 10 recover -- hp : 20 recover -- hp : 30
以上是关于Java自学代码--- 简单的线程同步和交互的主要内容,如果未能解决你的问题,请参考以下文章