java for循环四千多次 每次循环内部还要有其他处理逻辑 导致速度很慢 如何优化

java for循环四千多次 每次循环内部都要有其他处理逻辑 导致速度很慢 如何优化

9个回答

不知道具体的for内部还需要做什么,可以用下面的方式启线程处理,如下两个线程,一个线程跑1-1000另外一个线程跑1000-2000
楼主可以自己对下面的改造一下

    new Thread() {   
              public void  run() {  
                 for(int 1=0 ;i<1000;i++){
                        }

              }
        }.start(); 

        new Thread() {   
              public void  run() {  
                 for(int 1=1000 ;i<2000;i++){
                        }

              }
        }.start(); 

【1】哎,,有些问题不能用并行处理,,,下一个循环操作需要用到上一个循环的结果,,这种需要顺序执行的不好优化

【2】只有那种,不是十分依赖上层循环结果的才可以用并行优化
比如,一个数组乱序,求和(数组长度四千多)
我分成n组分别求和,最后n个组求和,,

不知道题主的“循环内部还要有其他处理逻辑”,,属于哪一种

不要每次循环都去处理逻辑,可以循环一百遍然后把这一百个预处理数据开一个线程去处理(具体的数值根据服务器的运载去设置),这样可以做到合理使用cpu资源的同时,提升执行效率

利用多线程去循环,把你的四千多次拆开分别传递给多个线程去执行

qq_27836205
Jordan裔 不会啊 忘大神指点一二
2 年多之前 回复

使用并行处理。并行计算

qq_27836205
Jordan裔 不会啊 忘大神指点一二
2 年多之前 回复

电脑处理的快,不优化也行

1、增加多线程处理
2、先分小块汇总,然后在大的汇总
3、能执行到跳过的或者跳出循环的控制好

4000个循环本身并不多,建议从“其他处理逻辑”入手优化。如上述几位所言,多线程,并行处理。

对于一些不需要利用其返回结果的,多线程并行处理。可以用eventBus来处理 (参考教程
以现在的计算机速度,4000次循环就感觉慢,最好检查一下代码是否有地方需要改进。

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
其他相关推荐
for循环中有多个if判断,for循环16次,优先执行一个if判断
Java for循环中有3个if判断依次执行。for循环16次, 我想让第一个if判断先执行16次(优先执行16次), 如果在16次中有符合第一个if判断的就执行停止循环。 如果16次之后,第一个if判断没有符合的结果,在依次执行第2和第3个if判断。 优先执行第一个if判断如何做,请大神赐教。
java 某某局的项目 求每个员工处理案件数目 我for循环一个个获取每个员工处理数目 导致系统太卡
求每个员工处理案件数目 再排出前十名 我for循环一个个获取每个员工处理数目 可是员工有四千多个 也就是for循环了四千多次 导致系统太卡 如何优化呢
java 求四千多用户的某一排名 如何用多线程 优化for循环
求四千多用户的某一排名,比如操作次数排名(不考虑sql写法),我先求出所有用户,然后for循环全部用户,得出每一个用户的操作次数,将用户名和对应操作次数放入一个map里面,再把这个map放入一个list里面,最后排出前十名,现在我想用多线程优化for循环,但是多线程的匿名内部类里面的全局变量只能是final的,final变量只能赋值一次啊,我就不能连续添加值到那个list里面了 怎么办?还有比如我现在开四个线程,每个线程for循环一千次,那么我如何写,等到四个线程全部结束再执行下面操作呢?
关于Java语言for循环内外变量定义的问题
今天被TeamLeader批了一顿,本来想和他争论争论的,后来感觉自己也不清楚,遂只有来Iteye讨教讨教了。 这是个关于在for循环内外变量定义的问题,先看代码: [code="java"] public class Test2 { public static void main(String[] args) { // 放入10000000的元素 List<Object> list = new ArrayList<Object>(10000000); for(int i = 0; i < 10000000; i++) { list.add(i, new Object()); } // 做10次循环,求均值 for(int j = 0; j < 10; j++) { // 变量在循环内定义 long t1 = System.currentTimeMillis(); for(Iterator<Object> iterator = list.iterator(); iterator.hasNext();) { Object object = iterator.next(); } long t2 = System.currentTimeMillis(); System.out.println("循环内" + (j + 1) + "次, 时间:" + (t2 - t1) + ";"); // 变量在循环外定义 t1 = System.currentTimeMillis(); Object object = null; for(Iterator<Object> iterator = list.iterator(); iterator.hasNext();) { object = iterator.next(); } t2 = System.currentTimeMillis(); System.out.println("循环外" + (j + 1) + "次, 时间:" + (t2 - t1) + ";"); } } } /*其中一次的运行结果 * * 变量在循环内定义 变量在循环外定义 *1次循环 359 359 *2次循环 360 343 *3次循环 344 360 *4次循环 359 359 *5次循环 344 359 *6次循环 360 359 *7次循环 360 359 *8次循环 344 359 *9次循环 344 359 *10次循环 344 359 */ [/code] 我在工作中有一段代码是放到循环内定义的,主要是习惯,以及变量最小作用域的理念。但teamleader告诉我要放到循环外面,放在里面性能不好,不太理解。这个问题发生后,我也在网络寻找答案,但结果差不多一半一半,有建议在内部定义,也有建议在外部定义,所以就更糊涂了...我现在所知道的有:在内部定义,满足变量最小作用域的理念,循环外没有使用这个变量,该变量就不会在循环外定义;但teamleader说在内部定义会多次申请栈内存,影响性能,但我写了上面的例子和查了下资料,也没有弄太清这里面是如何影响性能的,请帮助详细讲解下两种定义方式的好坏,及其原因,和jdk版本是否有关系。
java中for循环没有跳出
大家好,下面的代码中Cal.size()是1,for循环应该只执行一次,但是有时却执行了多次,System.out.println("H是:"+h);打印多次都是0,循环没有跳出,很奇怪,不明白是什么问题,以下是完整代码,三个for循环是同样的问题 //每五秒钟自动遍历一次数据库,将策略数据发送至指定集中控制器 Runnable send = new Runnable() { @Override public void run() { Mysend: //for无限循环 for(;;) { try{ //byte[] cllx={1,2,3}; Convertion con=new Convertion(); gettacticsdata data=new gettacticsdata(); //读取存储在Map中已登录用户ID Map<String, SocketChannel> map = Mymap.getChannels(); Iterator<String> it = map.keySet().iterator(); while (it.hasNext()) { String key = it.next(); SocketChannel obj = map.get(key); //判断当前客户是否在线,如果在线就传数据,不在就删除存储在Map中的登录信息 if(obj.isActive()==true) { //查询需要下发的策略B数据 ArrayList Bal = new ArrayList(); Bal=data.GetBdata(key); //判断是否有需要下发的策略 if(Bal.size()>0) { for(int i=0;i<Bal.size();i++) { System.out.println("I是:"+i); tacticsBdata Bl=(tacticsBdata) Bal.get(i); byte[] Bdata=con.GetBdata(Bl); //SocketChannel obj = map.get(key); if(Bdata.length==32) { ByteBuf Bsend =Unpooled.copiedBuffer(Bdata); obj.writeAndFlush(Bsend); } } } //查询需要下发的策略C数据 ArrayList Cal = new ArrayList(); Cal=data.GetCdata(key); //判断是否有需要下发的策略 if(Cal.size()>0) { for(int h=0;h<Cal.size();h++) { System.out.println("H是:"+h); tacticsCdata Cl=(tacticsCdata) Cal.get(h); byte[] Cdata=con.GetCdata(Cl); //SocketChannel obj = map.get(key); if(Cdata.length==18){ ByteBuf Csend =Unpooled.copiedBuffer(Cdata); obj.writeAndFlush(Csend); } } } //查询需要下发的策略A数据 ArrayList Aal = new ArrayList(); Aal=data.GetAdata(key); //判断是否有需要下发的策略 if(Aal.size()>0) { for(int j=0;j<Aal.size();j++) { System.out.println("J是:"+j); tacticsAdata Al=(tacticsAdata) Aal.get(j); byte[] Adata=con.GetAdata(Al); if(Adata.length==14){ ByteBuf Asend =Unpooled.copiedBuffer(Adata); obj.writeAndFlush(Asend); } } } }else { System.out.println("此ChannelID已掉线: " + obj); map.remove(key); obj.close(); } } } catch(Exception e) { break Mysend; } try { //线程休眠10秒钟后再次启动 Thread.sleep(10000); } catch (InterruptedException e) { //e.printStackTrace(); } } } }; new Thread(send).start();
多个方法可以循环调用吗?
比如主类的有一个循环3次的for循环,for循环中调用了2个成员方法,这2个方法可以重复执行5次吗?新手求解
循环查询数据库500次和用双层for循环进行25w次轮循哪个效率更高
有两张表A、B。 A有500条记录,B有500乃至更多条,查询A表所有记录封装成List; 现根据A表的ID查询B表中对应的记录,那么 List<A> listA = getObjects(A.class); for(A a : listA){/*循环查询数据库*/ B b= getObjectById(a.getId()); map.put("A",a.name); map.put("B",b.time); } List<B> listB = getObjects(B.class); for(A a : List<A>){ for(B b : List<B>){ if(a.getId() == b.getAid()) map.put("A",a.name); map.put("B",b.time); } } 这两种方式哪个效率高
Java的一个循环效率问题
<div class="iteye-blog-content-contain" style="font-size: 14px;"> <p>我写了一个简单,其中一个看似普通的循环却出乎了我的意料,是用Java写的。其中yz及pow的底数我现在改了一下:</p> <pre name="code" class="java">//方法一: double w = 0.0, yz = 1.234567; for (int i = 0; i &lt; currents.length; i++) { if (currents[i] &gt; i2) { w += yz * currents[i] * Math.pow(1.56, i0/currents[i]); } } return w; //方法二: double w = 0.0, yz = 1.234567; for (int i = pMax; i &lt; currents.length; i++) { w += yz * currents[i] * Math.pow(0.89, i0/currents[i]); } return w;</pre> <p> 代码如上,现在问题就是照我的理解方法二应该比方法一快一些才对,而进行了测试方法一需要114ms,方法二需要333ms(进行了多次测试取平均)</p> <p>我现在不知道到底是什么原因,所以上来请教讨论一下,谢谢各位!</p> <p><span style="font-size: 11px;">- -|||  没分</span></p> </div>
java实现 循环冗余校验(CRC)算法
算法的要求是如下: ① 装一个16 位寄存器,所有数位均为1。 ② 取被校验串的一个字节与16 位寄存器的高位字节进行“异或”运算。运算结果放 入这个16 位寄存器。 ③ 把这个16 寄存器向右移一位。 ④ 若向右(标记位)移出的数位是1,则生成多项式1010 0000 0000 0001 和这个寄 存器进行“异或”运算;若向右移出的数位是0,则返回③。 ⑤ 重复③和④,直至移出8 位。 ⑥ 取被校验串的下一个字节 ⑦ 重复③~⑥,直至被校验串的所有字节均与16 位寄存器进行“异或”运算,并移位 8 次。 ⑧ 这个16 位寄存器的内容即2 字节CRC 错误校验码。 校验码按照先高字节后低字节的顺序存放。 我自己理解实现了下: ``` public static short crc16(byte[] data) { short crc = (short) 0xFFFF; short dxs = (short) 0xA001; byte tc; byte sbit; for (int i = 0; i < data.length; i++) { tc = (byte) ((crc & 0xff00) >> 8); crc = (short) (tc ^ data[i]); for (int r = 0; r < 8; r++) { sbit = (byte) (crc & 0x01); crc = (short) (crc >> 1); if (sbit != 0) crc = (short) (crc ^ dxs); } } System.out.println(bytesToHexString(new byte[] { (byte) ((crc & 0xff00) >> 8), (byte) (crc & 0xff) })); return crc; } //将字节数组按16进制输出 public static String bytesToHexString(byte[] src) { StringBuilder stringBuilder = new StringBuilder(""); if (src == null || src.length <= 0) { return null; } for (int i = 0; i < src.length; i++) { int v = src[i] & 0xFF; String hv = Integer.toHexString(v); if (stringBuilder.length() != 0) { stringBuilder.append(","); } if (hv.length() < 2) { stringBuilder.append(0); } stringBuilder.append(hv); } return stringBuilder.toString(); } ``` 可是我计算出的接口和文档上对不上,不知道哪里有问题?
java 一次循环中,插入两条相同的数据
这是一个java写的程序,我在读到另一个系统的xml文件后,将数据插入到另一个系统的数据库,在插入前做判断,如果这条记录已经存在,那么更新,没有的话就插入,程序已经运行一年多没有问题了,最近有几个接口,都出现过一条数据重复插入的问题。 请各位给点意见,推测是哪方面的问题造成的,因为想重现错误非常难。 我的推测及根据: 1,数据库使用的是oracle,表的主键是一个自增序列,所以不能约束,重复值,但是一年多没有出过次类问题。 2,插入的两条数据的插入时间是相同的,例如有50条数据需要插入,那么循环50次,第一条插入的时间,可能会比最后一次插入的时间早1秒钟,其中第5条数据,在插入的时候居然是两条,数据包括插入的时间是一样的。这说明它应该是循环到此条数据时插入了两次。启动两个服务的可能性不大。 3,是网络问题造成的java和oracle之间有问题? [code="java"] for(int i=0;i<list.size();i++) { String tmp = list.getKey("id"); String sql = "select count(*) from tablename where id = '"+tmp+"'"; int count = executeQueuery(sql); if(count<1) insert(tmp); else update(tmp); } [/code] 以上代码是思路,大概就是这样子。是自动提交的,我怀疑在判断count<1的时候,连续插入了两次。有没有遇到此问题的,给点建议。 真是太郁闷了 等待中。 [b]问题补充:[/b] int count = executeQueuery(sql); 这个方法没有问题,其实就是看看数据库有没有这条记录,而且插入两条的情况是在 count<1时,连续插入两条,应为插入的系统时间都是一样的。 [b]问题补充:[/b] 单线程的,没有使用多线程
请教IDEA while循环debug问题
# 想调试一个使用JDBC从数据库读取Blob类型数据的程序,但是试了很多次debug不了其中的while循环 ## 在Servlet实现类的doPost方法中试了一个简单的while循环,发现可以调试 ```java int a=11; int i=0; while (++i<a){ System.out.println(i); } ``` ![图片说明](https://img-ask.csdn.net/upload/201910/02/1570014345_777656.png) ## 代码 ### Servlet doPost ``` String sql = "SELECT * FROM resource WHERE id = ?"; String[] path = new String[1]; path[0] = "F:\\program design\\JavaWeb\\web\\resource\\2.png"; //下面的方法传入数据库连接,接收数据的类,sql语句以及要将数据库中提取的文件放入的路径和sql语句中?的替代 //返回接收数据的类的实例的集合 ArrayList<Datas> arrayList = JDBC.searchBolb(connection, Datas.class, sql, path, 1); PrintWriter writer = response.getWriter(); for (Datas d : arrayList) { writer.println(d); } ``` ### JDBC ```java //重点请看while循环,其他错误只要能调试while循环我自己慢慢找 public static <T> ArrayList<T> searchBolb(Connection connection, Class<T> clazz, String sql, String[] resourcePath, Object... args) { //数据库表中最后一个字段为Blob类型 //输出类中封装Blob资源输出地址 PreparedStatement ps = null; ResultSet result = null; ResultSetMetaData rsmd = null; InputStream is = null; FileOutputStream fos = null; int resourcePathNumber = 0; ArrayList<T> collection = new ArrayList<T>(); try { ps = connection.prepareStatement(sql); for (int i = 0; i < args.length; i++) { ps.setObject(i + 1, args[i]); } result = ps.executeQuery(); rsmd = result.getMetaData(); while (result.next()) { int columnCount = rsmd.getColumnCount(); T t = clazz.getDeclaredConstructor().newInstance(); for (int i = 0; i < columnCount - 1; i++) { Object columnValue = result.getObject(i + 1); String columnLabel = rsmd.getColumnLabel(i + 1); Field field = clazz.getDeclaredField(columnLabel); field.setAccessible(true); field.set(t, columnValue); } Blob blob = result.getBlob(columnCount); String blobLabel = rsmd.getColumnLabel(columnCount); Field field = clazz.getDeclaredField(blobLabel); field.setAccessible(true); field.set(t, resourcePath); is = blob.getBinaryStream(); fos = new FileOutputStream(resourcePath[resourcePathNumber++]); byte[] buffer = new byte[1024]; int len; while ((len = is.read(buffer)) != -1) { fos.write(buffer, 0, len); } collection.add(t); } } catch (SQLException | IOException | NoSuchFieldException | NoSuchMethodException | IllegalAccessException | InstantiationException | InvocationTargetException e) { e.printStackTrace(); } finally { try { ps.close(); is.close(); fos.close(); } catch (SQLException | IOException e) { e.printStackTrace(); } if (collection == null) { System.out.println("Failed to search"); } return collection; } } ```` ![图片说明](https://img-ask.csdn.net/upload/201910/02/1570015047_843639.png) ![图片说明](https://img-ask.csdn.net/upload/201910/02/1570015068_774806.png) <br> 把断点设在144行(while循环第一行),运行到for循环第一行出错(用的f8,不进入方法体)(没有while循环过,这是第一次for循环),这里的错误是结果集关闭,但是显然并没有任何操作使之关闭(我试了另外一个没有问题的方法,报的同样的错误),怀疑是刚开始debug时就已经进行完了while循环,导致结果集关闭 <br> 请问需要把断点设在哪里,或者是怎么样才能解决上述问题?3Q
socket循环发送请求并读取响应时,循环到第二次之后就读不到响应内容
问题描述: 业务需求是有一个报文数组,我遍历该数组,每取到一个报文串,便通过socket发送至服务端处理,然后读取服务端响应的报文。但是经过反复测试,每次循环第一次的流程是正常的,但是循环到第二次之后,却读不到响应的报文(内容为空)。求各路神仙大虾帮我看看(PS:我看过网上很多的帖子,有的人说socket输入流就像一个一次性的杯子,只能使用一次。但是按这样的话,我岂不是每次发送都需要建立socket连接?这样太消耗资源了吧)。 这是我的业务逻辑代码 public void sendReq(String[] RequestXml) throws Exception{ Messenger messenger = new Messenger(SERVERIP, SERVERPORT, TIMEOUT, "UTF-8"); for (String requestXML : RequestXml) { String response = messenger.sendReq(requestXML); System.out.println(response); } messenger.close(); } 下面是我的socket发送类代码 public class Messenger { private static final Logger logger = Logger.getLogger(Messenger.class); private Socket soc; private PrintWriter pw; private BufferedReader sin; private String charset; /** * 初始化连接 * @param serverIp 连接IP * @param serverPort 连接端口 * @param timeout 超时时间 * @param charset 编码格式 * @throws Exception */ public Messenger(String serverIp, int serverPort, int timeout, String charset) throws Exception { this.soc = new Socket(serverIp, serverPort); this.charset = charset; soc.setSoTimeout(timeout); soc.setKeepAlive(true); } /** * 发送报文 * @param reqXML 待发送的报文 * @return */ public String sendReq(String reqXML) { StringBuffer responseStr = new StringBuffer(""); PrintWriter pw = null; BufferedReader sin =null; try { pw = new PrintWriter(new BufferedWriter(new OutputStreamWriter(soc.getOutputStream(), charset))); sin = new BufferedReader(new InputStreamReader(soc.getInputStream(), charset)); logger.info("【开始发送报文】"); pw.println(reqXML); pw.flush(); logger.info("【报文发送完毕】"); String str; while((str = sin.readLine()) != null) { responseStr.append(str); } logger.info("【成功读取响应报文】"); } catch(Exception e) { logger.warn("【读取响应报文时出错】" + e); } finally { if (pw != null) { pw.close(); } if (sin != null) { try { sin.close(); } catch (IOException e) {} } } return responseStr.toString(); } //关闭连接 public void close() { if (pw != null) { pw.close(); } if (sin != null) { try { sin.close(); } catch (IOException e) {} } if (soc != null) { try { soc.close(); } catch (IOException e) {} } logger.info("【关闭SOCKET连接】"); } }
java串口通信及处理大量数据
当我接手到这样一个项目的时候,我内心是崩溃的,第一次去处理串口通信,第一次那么短的时间去读取那么多的数据,第一次去存那么大量的数据,每一个问题都能让我在生死边缘徘徊,我先简单的表述一下这个程序的主要功能吧。 这个程序主要是对500个电流表头进行实时数据的监控,每100个电流表头为一组,通过一根串口线进行通讯,软件要实现的功能是循环的去读取这100个设备的电流数据。读取的时间是10s。意思是100ms读取完一个电流表头的数据,这条数据里存了这100ms内的100条电流数据。500个电流表头存一天的数据就是4亿3200万条数据,要求存一个月。 上述就是整个项目要完成的功能,在这个项目中遇到了两个难以解决的问题。 1.java串口通讯的延时,10s内去读取100个设备的数据,至少丢50条数据。后来发现,java从发送指令到监听到数据返回的时间大概在150ms到300ms之间,尝试了多种方法也无法解决。 2.大量的数据存储,根据计算,1天的数据量在4亿3200万条左右,这个数据怎么存到数据库中才能保证查询不会太过卡顿。并且,要存30天的数据。数据库的选择,数据结构的设计等。
关于JAVA插入,修改多条信息如何处理,谢谢!
刚发的帖子找不到了...第一次发帖见谅;内容如下 目前遇到一个问题,关于多条修改的问题; 如果一次要修改多条数据并存储的话该如何操作; 单条我是这么做的; String[] t=request.getParameterValues("t");然后插入LIST循环 PreparedStatement pst = (PreparedStatement) conn.prepareStatement ("INSERT INTO ……¥%& (*&……%#!!) VALUES ( ?, ?, ?,?)"); for (int i = 0; i < list.size(); i++) 如果多条怎么处理,假设一行有3个字段分别是 ID,NAME,DATE的话 同时接收3个字段如何做个循环...如果是要用bo set,get封装的话如何处理? 我该如何取值如何循环?谢谢指点!新手没有头绪; 请告诉个思路最好能有代码更直观一点; 5分钟刷新一次页面谢谢各位!
Java swing多线程实现聊天程序阻塞问题
1、在用swing写一个能够动态添加客户端的socket通信程序,即服务端用 一个异步线程持续监听新的客户端连接,如果有新的连接就新建一个客户端线 程来监听客户端,接收或者发送给客户端信息。 ```java //这是监听客户端连接的线程: new Thread(new Runnable() { @Override public void run() { // 异步线程持续监听端口连接 while (true){ if (server.isClosed()){ // 服务器一旦关闭,就跳出循环 break; } Socket temp = null; try { temp = server.accept(); JOptionPane.showMessageDialog(null,"连接建立成功,客户端端口号为:" +temp.getPort()); // 为每一个连接建立一个异步线程 Connection con = new Connection(temp); con.start(); connections.add(con); sockets.add(temp); } catch (IOException ex) { ex.printStackTrace(); } } } }).start(); ``` 这是客户端线程类: ```java class Connection extends Thread{ Socket socket; BufferedReader reader; PrintWriter writer; public Connection(Socket socket){ this.socket = socket; } @Override public void run() { System.out.println("来了!"); try { reader = new BufferedReader(new InputStreamReader(socket.getInputStream())); writer = new PrintWriter(socket.getOutputStream()); // 第一次连接,先写出已经存在的联系人 writer.println("还没有联系人"); // 再读取新建联系人的名字 String clientName = reader.readLine(); System.out.println("客户端名字:" +clientName); reader.close(); } catch (IOException e) { e.printStackTrace(); } /* while (true){ try { if (socket.isConnected() == false){ break; } } catch (Exception e) { e.printStackTrace(); } }*/ } } ``` 这是客户端启动时执行的方法: ```java @Override public void windowOpened(WindowEvent e) { // 窗口打开就建立连接 try { socket = new Socket("localhost",3030); reader = new BufferedReader(new InputStreamReader(socket.getInputStream())); writer = new PrintWriter(socket.getOutputStream()); } catch (IOException ex) { JOptionPane.showMessageDialog(null,"服务器未开启,不能连接,请关闭此客户端!"); } /* 连接一旦建立需要立刻执行的事情 * 1、向服务器发送该客户端的名字 * 2、获取其他已经存在的客户端名字 * */ try { System.out.println(reader.readLine()); writer.println(clientName); } catch (IOException ex) { ex.printStackTrace(); } } ``` 每次一到这个windowOpen方法的System.out.println(reader.readLine());这里就卡死,没有报错,直接卡住。 看了网上说什么readline()会因为没读到数据阻塞,所以猜想是服务端发送数据时一直没有发出来,不过没有找到解决办法,这是卡住时的情况截图 ![图片说明](https://img-ask.csdn.net/upload/201911/08/1573184051_750205.png)
java问题。。哪位大神帮我看看。。到底问题出在哪?在线等。。。
![图片说明](https://img-ask.csdn.net/upload/201704/25/1493111180_681578.png) ![图片说明](https://img-ask.csdn.net/upload/201704/25/1493111193_491474.png) 就这样的代码。。外面的for循环为什么只循环一次。。。。但是dr.getRelationData().size()这个的大小是很多次,为什么会这样?代码有什么问题么?
java多线程终止执行,没有执行ffinally
在一个线程的run方法中,有 try{ 处理1 }catch(Exception e){ 处理2 }ffinally{ 处理3 } 处理1调用了别的方法A,在生产环境中发现这个方法A在循环中抛了三次网络连接超时错误,A中也捕获了异常,记录了日志,但是就到此处,就发现线程没有执行后面的动作了,ffinally中的处理3也没有执行(通过日志)
java中如何快速替换文件内容,减少回收机制的触发
读取了一个txt文件内容为String,循环替换其中的内容,使用replace, 但是其中很费时,也会多次触发java的垃圾回收机制,如何优化下这种情况呢![其中关键代码](https://img-ask.csdn.net/upload/201612/15/1481785550_820848.jpg)
netty中怎么实现无限循环给每个客户端发数据?
正在做一个netty服务端,业务是这样的:客户端发数据给服务端,服务端收到之后发一条反馈数据回去;另外服务端需要实时查询数据库,如果有数据就发送给对应客户端,5秒循环一次,我把这两个业务写在同一个channelRead中,结果后者经常出现多次发送数据的情况,好像是多个线程都在执行这个循环,执行的周期不是5秒,5秒内执行了多次,也就是一条数据发了多次且次数不定,不知道是哪里的问题,感觉是自定义线程runnable和netty线程组之间没有协调工作,不知道怎么解决 ``` public class MyHandler extends ChannelHandlerAdapter { @Override public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception { 01接收客户端数据,并给予反馈,代码略 //02每五秒钟自动遍历一次数据库,将策略数据发送至指定客户端 Runnable send = new Runnable() { @Override public void run() { Mysend: //for无限循环 for(;;) { try{ Convertion con=new Convertion(); gettacticsdata data=new gettacticsdata(); //读取存储在Map中已登录用户ID Map<String, SocketChannel> map = Mymap.getChannels(); Iterator<String> it = map.keySet().iterator(); //for(int m=0;m<map.size();m++) while (it.hasNext()) { System.out.println("Map集合大小为:"+map.size()); String key = it.next(); System.out.println("key:"+key); SocketChannel obj = map.get(key); //判断当前客户是否在线,如果在线就传数据,不在就删除存储在Map中的登录信息 if(obj.isActive()==true) { data.updatelwzt(key); //查询需要下发的策略B数据 ArrayList Bal=data.GetBdata(key); //判断是否有需要下发的策略 if(Bal.size()>0) { for(int i=0;i<Bal.size();i++) { tacticsBdata Bl=(tacticsBdata) Bal.get(i); byte[] Bdata=con.GetBdata(Bl); //SocketChannel obj = map.get(key); if(Bdata.length==32){ ByteBuf Bsend =Unpooled.copiedBuffer(Bdata); obj.writeAndFlush(Bsend); } } } }else { System.out.println("此ChannelID已掉线: " + obj); String resultdk=data.updatelwztdk(key); map.remove(key); obj.close(); } } } catch(Exception e) { break Mysend; } try { //线程休眠5秒钟后再次启动 Thread.sleep(5000); } catch (InterruptedException e) { //e.printStackTrace(); } } } }; new Thread(send).start(); } @Override public void channelReadComplete(ChannelHandlerContext ctx) throws Exception { ctx.flush(); } @Override public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) { ctx.close(); } ```
程序员必须掌握的核心算法有哪些?
由于我之前一直强调数据结构以及算法学习的重要性,所以就有一些读者经常问我,数据结构与算法应该要学习到哪个程度呢?,说实话,这个问题我不知道要怎么回答你,主要取决于你想学习到哪些程度,不过针对这个问题,我稍微总结一下我学过的算法知识点,以及我觉得值得学习的算法。这些算法与数据结构的学习大多数是零散的,并没有一本把他们全部覆盖的书籍。下面是我觉得值得学习的一些算法以及数据结构,当然,我也会整理一些看过...
Python——画一棵漂亮的樱花树(不同种樱花+玫瑰+圣诞树喔)
最近翻到一篇知乎,上面有不少用Python(大多是turtle库)绘制的树图,感觉很漂亮,我整理了一下,挑了一些我觉得不错的代码分享给大家(这些我都测试过,确实可以生成) one 樱花树 动态生成樱花 效果图(这个是动态的): 实现代码 import turtle as T import random import time # 画樱花的躯干(60,t) def Tree(branch, ...
程序员请照顾好自己,周末病魔差点一套带走我。
程序员在一个周末的时间,得了重病,差点当场去世,还好及时挽救回来了。
我是Leader,我被降职成了普通员工,HR说:公司要梯队年轻化
“BAT也不是完美的避风港哇~”这是老刘说的,老刘是BAT某家的一个Leader,职级约类似T7(T族一般是技术族,管理是M族),在BAT某家呆了11年,但是在整个互联网行业推崇,梯队年轻化的氛围时,老刘所在的业务线,产品数据并不是太好看。于是前段时间被约谈了,只是从Leader变成了一线技术,薪水没太大变化,但是已经不是管理层队伍了,团队里的更年轻的人成了他的汇报对象,在这种职场角色反转的事情,...
计算机专业的书普遍都这么贵,你们都是怎么获取资源的?
介绍几个可以下载编程电子书籍的网站。 1.Github Github上编程书资源很多,你可以根据类型和语言去搜索。推荐几个热门的: free-programming-books-zh_CN:58K 星的GitHub,编程语言、WEB、函数、大数据、操作系统、在线课程、数据库相关书籍应有尽有,共有几百本。 Go语言高级编程:涵盖CGO,Go汇编语言,RPC实现,Protobuf插件实现,Web框架实...
小白学 Python 爬虫(25):爬取股票信息
人生苦短,我用 Python 前文传送门: 小白学 Python 爬虫(1):开篇 小白学 Python 爬虫(2):前置准备(一)基本类库的安装 小白学 Python 爬虫(3):前置准备(二)Linux基础入门 小白学 Python 爬虫(4):前置准备(三)Docker基础入门 小白学 Python 爬虫(5):前置准备(四)数据库基础 小白学 Python 爬虫(6):前置准备(...
这三名男子靠开加密矿池获得7.22 亿美元,却不兑现收益拿去奢侈挥霍……
来源 /cointelegraph编译/火火酱责编 / Carol出品 / 区块链大本营(blockchain_camp)根据美国司法部12月10日发布的声明,美国新泽西州当局宣布...
卸载 x 雷某度!GitHub 标星 1.5w+,从此我只用这款全能高速下载工具!
作者 | Rocky0429 来源 | Python空间 大家好,我是 Rocky0429,一个喜欢在网上收集各种资源的蒟蒻… 网上资源眼花缭乱,下载的方式也同样千奇百怪,比如 BT 下载,磁力链接,网盘资源等等等等,下个资源可真不容易,不一样的方式要用不同的下载软件,因此某比较有名的 x 雷和某度网盘成了我经常使用的工具。 作为一个没有钱的穷鬼,某度网盘几十 kb 的下载速度让我...
2019年还剩1天,我从外包公司离职了
这日子过的可真快啊,2019年还剩1天,外包公司干了不到3个月,我离职了
只因接了一个电话,程序员被骗 30 万!
今天想给大家说一个刚刚发生在我身边的一起真实的诈骗经历,我的朋友因此被骗走30万。注:为了保护当事人隐私,部分情节进行了修改。1平安夜突来的电话开始以为就像普通的诈骗一样,想办法让你把钱...
一名大专同学的四个问题
【前言】   收到一封来信,赶上各种事情拖了几日,利用今天要放下工作的时机,做个回复。   2020年到了,就以这一封信,作为开年标志吧。 【正文】   您好,我是一名现在有很多困惑的大二学生。有一些问题想要向您请教。   先说一下我的基本情况,高考失利,不想复读,来到广州一所大专读计算机应用技术专业。学校是偏艺术类的,计算机专业没有实验室更不用说工作室了。而且学校的学风也不好。但我很想在计算机领...
复习一周,京东+百度一面,不小心都拿了Offer
京东和百度一面都问了啥,面试官百般刁难,可惜我全会。
Java 14 都快来了,为什么还有这么多人固守Java 8?
从Java 9开始,Java版本的发布就让人眼花缭乱了。每隔6个月,都会冒出一个新版本出来,Java 10 , Java 11, Java 12, Java 13, 到2020年3月份,...
达摩院十大科技趋势发布:2020 非同小可!
【CSDN编者按】1月2日,阿里巴巴发布《达摩院2020十大科技趋势》,十大科技趋势分别是:人工智能从感知智能向认知智能演进;计算存储一体化突破AI算力瓶颈;工业互联网的超融合;机器间大规模协作成为可能;模块化降低芯片设计门槛;规模化生产级区块链应用将走入大众;量子计算进入攻坚期;新材料推动半导体器件革新;保护数据隐私的AI技术将加速落地;云成为IT技术创新的中心 。 新的画卷,正在徐徐展开。...
面试官刁难:Java字符串可以引用传递吗?
老读者都知道了,六年前,我从苏州回到洛阳,抱着一幅“海归”的心态,投了不少简历,也“约谈”了不少面试官,但仅有两三个令我感到满意。其中有一位叫老马,至今还活在我的手机通讯录里。他当时扔了一个面试题把我砸懵了:“王二,Java 字符串可以引用传递吗?” 我当时二十三岁,正值青春年华,从事 Java 编程已有 N 年经验(N &lt; 4),自认为所有的面试题都能对答如流,结果没想到啊,被“刁难”了—...
轻松搭建基于 SpringBoot + Vue 的 Web 商城应用
首先介绍下在本文出现的几个比较重要的概念: 函数计算(Function Compute): 函数计算是一个事件驱动的服务,通过函数计算,用户无需管理服务器等运行情况,只需编写代码并上传。函数计算准备计算资源,并以弹性伸缩的方式运行用户代码,而用户只需根据实际代码运行所消耗的资源进行付费。Fun: Fun 是一个用于支持 Serverless 应用部署的工具,能帮助您便捷地管理函数计算、API ...
讲真,这两个IDE插件,可以让你写出质量杠杠的代码
周末躺在床上看《拯救大兵瑞恩》 周末在闲逛的时候,发现了两个优秀的 IDE 插件,据说可以提高代码的质量,我就安装了一下,试了试以后发现,确实很不错,就推荐给大家。 01、Alibaba Java 代码规范插件 《阿里巴巴 Java 开发手册》,相信大家都不会感到陌生,其 IDEA 插件的下载次数据说达到了 80 万次,我今天又贡献了一次。嘿嘿。 该项目的插件地址: https://github....
Python+OpenCV实时图像处理
目录 1、导入库文件 2、设计GUI 3、调用摄像头 4、实时图像处理 4.1、阈值二值化 4.2、边缘检测 4.3、轮廓检测 4.4、高斯滤波 4.5、色彩转换 4.6、调节对比度 5、退出系统 初学OpenCV图像处理的小伙伴肯定对什么高斯函数、滤波处理、阈值二值化等特性非常头疼,这里给各位分享一个小项目,可通过摄像头实时动态查看各类图像处理的特点,也可对各位调参、测试...
2020年一线城市程序员工资大调查
人才需求 一线城市共发布岗位38115个,招聘120827人。 其中 beijing 22805 guangzhou 25081 shanghai 39614 shenzhen 33327 工资分布 2020年中国一线城市程序员的平均工资为16285元,工资中位数为14583元,其中95%的人的工资位于5000到20000元之间。 和往年数据比较: yea...
为什么猝死的都是程序员,基本上不见产品经理猝死呢?
相信大家时不时听到程序员猝死的消息,但是基本上听不到产品经理猝死的消息,这是为什么呢? 我们先百度搜一下:程序员猝死,出现将近700多万条搜索结果: 搜索一下:产品经理猝死,只有400万条的搜索结果,从搜索结果数量上来看,程序员猝死的搜索结果就比产品经理猝死的搜索结果高了一倍,而且从下图可以看到,首页里面的五条搜索结果,其实只有两条才是符合条件。 所以程序员猝死的概率真的比产品经理大,并不是错...
害怕面试被问HashMap?这一篇就搞定了!
声明:本文以jdk1.8为主! 搞定HashMap 作为一个Java从业者,面试的时候肯定会被问到过HashMap,因为对于HashMap来说,可以说是Java集合中的精髓了,如果你觉得自己对它掌握的还不够好,我想今天这篇文章会非常适合你,至少,看了今天这篇文章,以后不怕面试被问HashMap了 其实在我学习HashMap的过程中,我个人觉得HashMap还是挺复杂的,如果真的想把它搞得明明白...
毕业5年,我问遍了身边的大佬,总结了他们的学习方法
我问了身边10个大佬,总结了他们的学习方法,原来成功都是有迹可循的。
python爬取百部电影数据,我分析出了一个残酷的真相
2019年就这么匆匆过去了,就在前几天国家电影局发布了2019年中国电影市场数据,数据显示去年总票房为642.66亿元,同比增长5.4%;国产电影总票房411.75亿元,同比增长8.65%,市场占比 64.07%;城市院线观影人次17.27亿,同比增长0.64%。 看上去似乎是一片大好对不对?不过作为一名严谨求实的数据分析师,我从官方数据中看出了一点端倪:国产票房增幅都已经高达8.65%了,为什...
推荐10个堪称神器的学习网站
每天都会收到很多读者的私信,问我:“二哥,有什么推荐的学习网站吗?最近很浮躁,手头的一些网站都看烦了,想看看二哥这里有什么新鲜货。” 今天一早做了个恶梦,梦到被老板辞退了。虽然说在我们公司,只有我辞退老板的份,没有老板辞退我这一说,但是还是被吓得 4 点多都起来了。(主要是因为我掌握着公司所有的核心源码,哈哈哈) 既然 4 点多起来,就得好好利用起来。于是我就挑选了 10 个堪称神器的学习网站,推...
这些软件太强了,Windows必装!尤其程序员!
Windows可谓是大多数人的生产力工具,集娱乐办公于一体,虽然在程序员这个群体中都说苹果是信仰,但是大部分不都是从Windows过来的,而且现在依然有很多的程序员用Windows。 所以,今天我就把我私藏的Windows必装的软件分享给大家,如果有一个你没有用过甚至没有听过,那你就赚了????,这可都是提升你幸福感的高效率生产力工具哦! 走起!???? NO、1 ScreenToGif 屏幕,摄像头和白板...
(总结)阿里面试问了ArrayList,都问了啥?
我是真的没想到,面试官会这样问我ArrayList。
曾经优秀的人,怎么就突然不优秀了。
职场上有很多辛酸事,很多合伙人出局的故事,很多技术骨干被裁员的故事。说来模板都类似,曾经是名校毕业,曾经是优秀员工,曾经被领导表扬,曾经业绩突出,然而突然有一天,因为种种原因,被裁员了,...
大学四年因为知道了这32个网站,我成了别人眼中的大神!
依稀记得,毕业那天,我们导员发给我毕业证的时候对我说“你可是咱们系的风云人物啊”,哎呀,别提当时多开心啦????,嗯,我们导员是所有导员中最帅的一个,真的???? 不过,导员说的是实话,很多人都叫我大神的,为啥,因为我知道这32个网站啊,你说强不强????,这次是绝对的干货,看好啦,走起来! PS:每个网站都是学计算机混互联网必须知道的,真的牛杯,我就不过多介绍了,大家自行探索,觉得没用的,尽管留言吐槽吧???? 社...
良心推荐,我珍藏的一些Chrome插件
上次搬家的时候,发了一个朋友圈,附带的照片中不小心暴露了自己的 Chrome 浏览器插件之多,于是就有小伙伴评论说分享一下我觉得还不错的浏览器插件。 我下面就把我日常工作和学习中经常用到的一些 Chrome 浏览器插件分享给大家,随便一个都能提高你的“生活品质”和工作效率。 Markdown Here Markdown Here 可以让你更愉快的写邮件,由于支持 Markdown 直接转电子邮...
看完这篇HTTP,跟面试官扯皮就没问题了
我是一名程序员,我的主要编程语言是 Java,我更是一名 Web 开发人员,所以我必须要了解 HTTP,所以本篇文章就来带你从 HTTP 入门到进阶,看完让你有一种恍然大悟、醍醐灌顶的感觉。 最初在有网络之前,我们的电脑都是单机的,单机系统是孤立的,我还记得 05 年前那会儿家里有个电脑,想打电脑游戏还得两个人在一个电脑上玩儿,及其不方便。我就想为什么家里人不让上网,我的同学 xxx 家里有网,每...
立即提问