当前位置: 代码网 > it编程>编程语言>Java > Java中串行接口调用优化方式

Java中串行接口调用优化方式

2024年05月26日 Java 我要评论
java串行接口调用优化准备面试总结下1.completablefuture static threadpoolexecutor poolexecutor = new threadpoolexecut

java串行接口调用优化

准备面试总结下

 1.completablefuture 

 static threadpoolexecutor poolexecutor = new threadpoolexecutor(10, 20, 1000l, timeunit.microseconds, new arrayblockingqueue<>(100));
 
    public static void main(string[] args) throws executionexception, interruptedexception {
        completablefuture<integer> task1 = completablefuture.supplyasync(() -> {
            try {
                system.out.println("task1");
                thread.sleep(1000);
            } catch (interruptedexception e) {
                throw new runtimeexception(e);
            }
            return 1000;
        }, poolexecutor);
 
        completablefuture<integer> task2 = completablefuture.supplyasync(() -> {
            try {
                system.out.println("task2");
                thread.sleep(2000);
            } catch (interruptedexception e) {
                throw new runtimeexception(e);
            }
            return 2000;
        }, poolexecutor);
 
 
        completablefuture<integer> task3 = completablefuture.supplyasync(() -> {
            try {
                system.out.println("task3");
                thread.sleep(10000);
            } catch (interruptedexception e) {
                throw new runtimeexception(e);
            }
            return 5000;
        }, poolexecutor);
        integer result1 = task1.get();
        system.out.println(result1);
        integer result2 = task2.get();
        system.out.println(result2);
        integer result3 = task3.get();
        system.out.println(result3);
        completablefuture<void> voidcompletablefuture = completablefuture.allof(task1, task2, task3);
        poolexecutor.shutdown();
        system.out.println("执行完毕");
 
    }

2.coutdownlatch 

static hashmap<string, integer> map = new hashmap<string, integer>();
 
    public static void main(string[] args) throws interruptedexception, executionexception {
        threadpoolexecutor poolexecutor = new threadpoolexecutor(10, 20, 1000l, timeunit.microseconds, new arrayblockingqueue<>(100));
        countdownlatch countdownlatch = new countdownlatch(3);
 
 
        future<integer> task1 = poolexecutor.submit(new callable<integer>() {
            @override
            public integer call() throws exception {
                system.out.println("任务1");
                thread.sleep(1000);
                system.out.println("任务1结束");
                countdownlatch.countdown();
                return 1000;
            }
        });
 
        future<integer> task2 = poolexecutor.submit(new callable<integer>() {
            @override
            public integer call() throws exception {
                system.out.println("任务2");
                thread.sleep(500);
                system.out.println("任务2结束");
                countdownlatch.countdown();
                return 500;
            }
        });
 
        future<integer> task3 = poolexecutor.submit(new callable<integer>() {
            @override
            public integer call() throws exception {
                system.out.println("任务3");
                thread.sleep(2000);
                system.out.println("任务3结束");
                countdownlatch.countdown();
                return 2000;
            }
        });
        map.put("task1", task1.get());
        map.put("task2", task1.get());
        map.put("task3", task1.get());
 
 
        system.out.println("线程跑完了");
        countdownlatch.await();
        system.out.println("---------------任务执行结束-------------");
        poolexecutor.shutdown();
 
    }

3.阻塞获取异步调用结果

   public static void main(string[] args) throws executionexception, interruptedexception {
        executorservice executorservice = executors.newfixedthreadpool(3);
        future<string> submit = executorservice.submit(new callable<string>() {
            @override
            public string call() throws exception {
                thread.sleep(1000);
                return "its done";
            }
        });
        while (true){
            if (submit.isdone()){
                system.out.println(submit.get());
                break;
            }
            system.out.println(submit.isdone());
 
        }
    }

4.除了上面两个方法 还有 cyclicbarrier,semaphore也都可以实现,可以自己尝试下

java串口程序的调用

rxtx串口插件的使用方法(windows平台)

1、把rxtxparallel.dll、rxtxserial.dll拷贝到:c:\windows\system32下。

2、如果是在开发的时候(jdk),需要把rxtxcomm.jar、rxtxparallel.dll、rxtxserial.dll拷贝到…\jre…\lib\ext下;如:d:\program files\java\jre1.6.0_02\lib\ext

3、需要选中项目右键->preperties->java build path->libraries->选择external folder–>选择rxtxcomm.jar.

  • 拷贝 rxtxcomm.jar 到 <java_home>\jre\lib\ext目录中;
  • 拷贝 rxtxserial.dll 到 <java_home>\jre\bin目录中;
  • 拷贝 rxtxparallel.dll 到 <java_home>\jre\bin目录中;

其中<java_home>为jdk安装路径

下面是一些程序运行测试写的方法

package com.serialport;

import java.io.ioexception;
import java.io.inputstream;
import java.io.outputstream;
import java.util.date;
import java.util.enumeration;
import java.util.hashset;
import java.util.toomanylistenersexception;
import java.util.concurrent.blockingqueue;
import java.util.concurrent.linkedblockingqueue;

import com.readtable.hextest;

import gnu.io.commport;
import gnu.io.commportidentifier;
import gnu.io.portinuseexception;
import gnu.io.serialport;
import gnu.io.serialportevent;
import gnu.io.serialporteventlistener;
import gnu.io.unsupportedcommoperationexception;

/**
 * 这个是一个更加完善的串口调用及接收函数类
 * @author administrator
 *
 */
public class serialreceiver extends thread implements serialporteventlistener{
  hextest hext2 = new hextest();
  
  
  	 
  static commportidentifier portid; // 串口通信管理类
  static enumeration<?> portlist; // 有效连接上的端口的枚举
  static inputstream inputstream; //从串口来数据的输入流
  static outputstream outputstream;// 向串口输出的流
  static serialport serialport; // 串口的引用
  
  private static byte[] readbuffer = new byte[1024]; // 4k的buffer空间,缓存串口读入的数据 
  int numbytes;  //buffer中的实际数据字节数 ,每一次读取的字节数据 
  // 堵塞队列用来存放读到的数据
  private blockingqueue<string> msgqueue = new linkedblockingqueue<string>();

 
  //其他的常量设置
  //端口是否打开了  
  boolean isopen = false;  
  // 端口读入数据事件触发后,等待n毫秒后再读取,以便让数据一次性读完  
  public static int params_delay = 1000; // 延时等待端口数据准备的时间  
  public static int params_timeout = 2000; // 超时时间  
  public static string params_port = "com4"; // 端口名称  
  public static int params_rate = 2400; // 波特率  
  public static int params_databits = 8; // 数据位  
  public static int params_stopbits = 1; // 停止位  
  public static int params_parity = 1; // 奇偶校验  
  

  /**
   * serialport eventlistene 的方法,持续监听端口上是否有数据流
   */
	@override
	public void serialevent(serialportevent event) {
		// todo auto-generated method stub
		switch (event.geteventtype()) {
        case serialportevent.data_available:// 当有可用数据时读取数据
    	  recetest();     
          break;
      }
	}
	
	/**
	 * 接收的数据进行打印测试
	 */
	private void recetest() {

	    try {
              numbytes = 0;
              while (inputstream.available() > 0) {            	 
                  numbytes += inputstream.read(readbuffer,numbytes,1024);
              }

                if (numbytes > 0) {
                    msgqueue.add(new date() +"方法2接收的字节数为:"+numbytes+ "   收到的数据为:-----"
                    		+ hext2.arraytohexstr(readbuffer, 0, numbytes));
                    readbuffer = new byte[1024];  //重新构造缓冲对象,否则有可能会影响接下来接收的数据
                } else {
                    msgqueue.add("额------没有读到数据");
                }
            
        } catch (ioexception e) {
        	
        }
	
	}
	
	
	
	/**
	 * 根据串口名,获取串口接口
	 * @param portname
	 * @return
	 */
	public serialport openserialport(string portname) {
		 //获取设备上的所有端口
	      portlist = commportidentifier.getportidentifiers();

	      while (portlist.hasmoreelements()) {
	          // 获取相应串口对象
	          portid = (commportidentifier) portlist.nextelement();
	          
	          system.out.println("设备类型:--->" + portid.getporttype());
	          system.out.println("设备名称:--->" + portid.getname());
	          
	          //判断端口类型是否为串口
	          if (portid.getporttype() == commportidentifier.port_serial) {

	              // 判断如果输入的串口名对应的串口存在,就打开该串口
	              if (portid.getname().equals(portname)) {
	                  try {
	                      // 打开串口名字为com_4(名字任意),延迟为2毫秒
	                      serialport = (serialport) portid.open("com_3", 2000);
                          return serialport;
	                  } catch (portinuseexception e) {
	                      e.printstacktrace();
	                      return null;
	                  }
	                  
	              }
	          
	          }
	       }
	      return null;
	      
	}
	
	/**
	 * 打开串口的函数
	 * @param portname  串口名
	 * @param bitrate   波特率
	 * @param databit   数据位
	 * @param stopbit   停止位
	 * @param parity    校验方式:奇 偶 无
	 * @return
	 */
	public int opencomport(string portname,int bitrate,int databit,int stopbit,int parity) {
		serialport = openserialport(portname);
		if(serialport != null) {
			// 设置当前串口的输入输出流
            try {
                inputstream = serialport.getinputstream();
                outputstream = serialport.getoutputstream();
            } catch (ioexception e) {
                e.printstacktrace();
                return 0;
            }
            // 给当前串口添加一个监听器
            try {
                serialport.addeventlistener(this);
            } catch (toomanylistenersexception e) {
                e.printstacktrace();
                return 0;
            }
            // 设置监听器生效,即:当有数据时通知
            serialport.notifyondataavailable(true);
            
            //给串口设置一些参数
            try {
                // 比特率、数据位、停止位、奇偶校验位
                serialport.setserialportparams( bitrate,databit,stopbit,parity);
            } catch (unsupportedcommoperationexception e) {
                e.printstacktrace();
                return 0;
            }

            return 1;
		}
		
		return 0;
	}
	

	
	@override
	public void run() {
		// todo auto-generated method stub
		 try {
	            system.out.println("--------------任务处理线程运行了--------------");
	            while (true) {
	                //如果堵塞队列中存在数据就将其输出
	                if (msgqueue.size() > 0) {
	                    system.out.println(msgqueue.take());
	                }
	            }
	        } catch (interruptedexception e) {
	            // todo auto-generated catch block
	            e.printstacktrace();
	        }
	}
	
	 public static void main(string[] args) {
		 
		    serialreceiver cread = new serialreceiver();
		    
		    params_port = "com3"; // 端口名称  
		    params_rate = 2400; // 波特率  
		    params_databits = serialport.databits_8;  //数据位
		    params_stopbits = serialport.stopbits_1; // 停止位             
		    params_parity =  serialport.parity_even; // 奇偶校验
		    
	        int i = cread.opencomport(params_port,params_rate,params_databits,
	        		                  params_stopbits,params_parity);
	        if (i == 1) {
	            // 启动线程来处理收到的数据
	        	 cread.start();
	            try {
	            	
	            	//发送指令
	            	hextest hext = new hextest();
	        		byte[] bst = hext.readtable07(1,1, 0,3);
	            	outputstream.write(bst, 0,bst.length);

	            } catch (ioexception e) {
	                // todo auto-generated catch block
	                e.printstacktrace();
	            }
	        } else {
	            return;
	        }
	        
	 }	


}

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持代码网。

(0)

相关文章:

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2025  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com