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自学代码--- 简单的线程同步和交互的主要内容,如果未能解决你的问题,请参考以下文章

Java自学-多线程 交互

同步-同步锁-死锁-线程交互-线程综合示例

Java并发编程:多线程环境中安全使用集合API(含代码)

Java线程与并发编程实践----同步

java多线程编程

Java多线程编程