欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Java多线程 应用场景

程序员文章站 2022-03-05 17:00:48
...

1.服务器向客户端传递消息

在此应用场景的时候 需要保证100%的发送给客户端,那么发给客户端之后,客户端返回一个消息告诉服务器,已经收到。当服务器一直没有收到客户端返回的消息,那么服务器会一直发送这个信息,直到客户端发送回确认信息,这时候再删除重复发送的这个信息。


为了模拟这个场景,这里写两个线程,一个是发送,一个是接收,把发送的信息,要保存到线程安全的对象里面,防止发生线程安全问题,这里采用concurrenthashmap。

1.1 发送线程代码

    package site.onel.thread;

    import java.util.Map.Entry;

    public class PushThread extends Thread{

        @Override
        public void run() {
            // TODO Auto-generated method stub
            try {
                sleep(6000);
                while(MainThread.pushmessage.size()>0){
                    //重发消息
                    for(Entry<Integer, String> hashMap:MainThread.pushmessage.entrySet()){
                        System.out.println("消息id:"+hashMap.getKey()+"未发送成功,在此重发:"+hashMap.getValue());
                    }
                    sleep(1000);
                }
            } catch (InterruptedException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }

    }

1.2 删除线程代码

package site.onel.thread;

import java.util.Map.Entry;

public class RemoveThread extends Thread {

    @Override
    public void run() {
        // TODO Auto-generated method stub
        try {
            for (int i = 0; i < 10000; i++) {
                sleep(2000);
                for(Entry<Integer, String> map:MainThread.pushmessage.entrySet()){
                    if (map.getKey()==i) {
                        System.out.println("成功收到id为:"+map.getKey()+"返回的信息,删除该元素");
                        MainThread.pushmessage.remove(map.getKey());
                    }
                }
                System.out.println("内存对象中的元素数量为:"+MainThread.pushmessage.size());
            }
        } catch (InterruptedException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }

}

1.3 程序入口 线程启动 代码

package site.onel.thread;

import java.util.concurrent.ConcurrentHashMap;

public class MainThread extends Thread{
    public static ConcurrentHashMap<Integer, String> pushmessage=new ConcurrentHashMap<Integer,String>();
    public static void main(String[] args) {
        for (int i = 0; i < 10; i++) {
            pushmessage.put(i, "该消息是id为"+i+"的消息");
        }
        Thread pushThread=new PushThread();
        Thread remove=new RemoveThread();
        pushThread.start();
        remove.start();
        for (int i = 10; i < 20; i++) {
            pushmessage.put(i, "又一波到来,消息是id为"+i+"的消息");
        }
    }
}