java多线程实践和总结

我在使用java实现网络编程实例时,发现收发数据重复,特别是用udp网络协议的时候,观察发现服务器发送的数据和客户端接收的数据居然不同步,客户端收到的数据是上一次的重复!刚开始,我以为是丢包或者是DatagramSocket会缓存原数据,导致了重复读,但是服务器每次都重复发送两次,问题显然是在别的地方了。

我在服务器端使用了多线程来处理客户端的连接,使用newFixedThreadPool创建线程池,并调用execute执行线程,一个很简单的例子,怎么会有问题呢?原来是因为我在自己的线程类里面使用了start();其实,execute已经调用了start(),也就是线程对象重复执行了两次。客户端的send和receive都是阻塞的,所以就导致了收到的上一次服务端重复发送的数据。其实,还是我对Java的线程不熟悉导致的,居然不知道execute就已经执行线程了,没必要再调用start()。

低级的失误,我在查找问题的时候学到线程的另一些比较的重要的知识点,下面是我的一些个人见解和小结。

  • Thread和Runnable

因为Java不支持多重继续,所以使用Runnable接口创建线程对象可以更加灵活。还有的文章说,Runnable能够实现资源共享:          

MyThread mt=new MyThread();  
new Thread(mt).start();
new Thread(mt).start();
其中 MyThread  implements  Runnable,这样就共享了mt线程对象。但是Thread其实也是可以的,这很容易理解因为Thread本身也是Runnable接口的子类,当线程执行的时候,都会去同一个给对象mt分配的地址上取值,也就是说操作的实际上是同一块堆栈地址。

  • run()和start()
run()就是直接调用线程对象里面重载实现的run()函数,和普通的函数调用没有任何区别,因此,run()就是在当前线程下执行对象的run函数代码。

  start()是启用一个新的用户线程执行对象的run函数。

  •  newFixedThreadPool和newCachedThreadPool
   一般推荐使用newFixedThreadPool,因为可以确定最大创建的线程数量,防止在有大量客户端同时连接服务器时出现线程数量过多,导致无法预料的问题。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值