⑴ java两个线程分别返回两个ResultSet,如何分多次读取两个ResultSet的结果
创建实体
ResultBean
private RsultSet resultSet;
private List<Bean> resultList;
包含方法:
方法1:public List<Bean> getResultList();每次将resultList清空后使用resultSet.next读取Bean再添加,判断是否遍历完毕,遍历完毕调用closeResultSet方法并返回null
方法2:public void closeResultSet();关闭ResultSet
2.建立一个单例工具类ResultUtil,包含以下私有成员
private Map<用户操作标识,ResultBean> resultMap;
用户操作标识每次进入页面时随机生成一个且不可重复,后续点击加载都是使用页面初始化时使用的用户操作标识
方法1:public void pushResultBean(String 用户操作标识,ResultBean resultBean) ;添加ResultBean到resultMap中,key为用户操作标识;
方法2: public ResultBean getResultBean(String 用户操作标识) 根据用户操作标识取得ResultBean;
方法 3:public void removeResultBean(String 用户操作标识);通过用户操作标识remove
3.接口层
通过用户标识调用单例工具类的ResultUtil.getResultBean方法,通过得到的ResultBean再调用getResultList方法,当getResultList方法返回结果为空将调用ResultUtil.removeResultBean方法
4.前端
每次通过用户操作标识请求接口,得到响应结果追加即可
机优化方案:还需要ResultUtil中的resultMap回收,可以考虑使用websoket,或者心跳机制,想简单的话先用心跳机制解决,单独开一个接口,前端定时调用,如果超过三十秒该用户操作标识没有心跳检测调用ResultUtil.removeResultBean方法,若是用户体量大的话考虑使用netty
⑵ JAVA多线程有哪几种实现方式
JAVA多线程实现方式主要有三种:继承Thread类、实现Runnable接口、使用ExecutorService、Callable、Future实现有返回结果的多线程。其中前两种方式线程执行完后都没有返回值,只有最后一种是带返回值的。
1、继承Thread类实现多线程
继承Thread类的方法尽管被我列为一种多线程实现方式,但Thread本质上也是实现了Runnable接口的一个实例,它代表一个线程的实例,并且,启动线程的唯一方法就是通过Thread类的start()实例方法。start()方法是一个native方法,它将启动一个新线程,并执行run()方法。这种方式实现多线程很简单,通过自己的类直接extend Thread,并复写run()方法,就可以启动新线程并执行自己定义的run()方法。例如:
[java]view plain
{
publicvoidrun(){
System.out.println("MyThread.run()");
}
}
[java]view plain
MyThreadmyThread1=newMyThread();
MyThreadmyThread2=newMyThread();
myThread1.start();
myThread2.start();
[java]view plain
{
publicvoidrun(){
System.out.println("MyThread.run()");
}
}
[java]view plain
MyThreadmyThread=newMyThread();
Threadthread=newThread(myThread);
thread.start();
[java]view plain
publicvoidrun(){
if(target!=null){
target.run();
}
}
⑶ java多线程的问题为何输出结果只有一个
1、主要是tt.join的问题。
2、当子线程开启后,主线程和子线程是并发或并行执行的,会多线程输出。
但是tt.join是指将tt线程与主线程(即tt.join这段代码所运行时候的线程)合并,即等tt.join运行完后执行刚刚的主线程。
而你的tt线程中的run()方法为:while(true)所以tt.join之后,tt一直在运行,
故只能看一个线程在运行。
希望能解决你的问题。