多线程编程中的两种方式的对比

在HIT软件构造的实验6(Multi-Thread Concurrent Programming)中遇到了多线程编程问题,我在学习过程中学习了两种写法。
一是,创建lock和unlock方法手动锁。
二是,使用线程池。

lock和unlock方法我看我的同学比较爱使用的,可能因为是新手吧。sychronized是老师上课特意强调的,可能较为主流。线程池是我查资料是看到的方法,我的同学们都不太听说过,但是大佬觉得线程池很厉害。但是经过实验结果来看,线程池在数据规模较大的情况下表现更加良好。首先它不需要多余的方法,使用java自带的库即可。其次使用线程池运行速度明显更快。在实验中,我使用线程池方法在运行500个对象后只需要2-3分钟就可以运行结束,而同学使用了一般的方式之后一般要运行更久,经过我的估计是需要8-9分钟。

这两个方法我都使用了一下,为了更方便说明,我简单介绍一下实验的要求:
猴子过河问题:有N只猴子,每t秒生出k只,所有猴子的最大速度为MV。共有n个梯子在河的上面,每个梯子的长度为h(即有h个踏板)。猴子分别从河两边出生并只能通过梯子渡过河。过河时,猴子不能相对而行,否则会发生死锁。后面的猴子也不能越过前面的猴子。抽象来说,就是有N只猴子共享n个梯子(的状态),但不能发生死锁。

一、lock和unlock方法
需要锁的对象就是猴子Monkey了,共享的资源就是梯子Ladder了,但是梯子的踏板上是否有猴子才是我们关系的,因此在踏板上建立lock和unlock。
lock是踏板列Rung里的方法
这主要是对梯子上的踏板的状态来操作的。此时若是!islock状态就可以把这个猴子加入这个踏板上。
unlock是在踏板类Rung中的方法
unlock与lock也是同理。
那这是运用在哪里呢?首先猴子要选择合适的梯子,在多线程的情况下,我们选梯子是就要把合适的梯子锁起来。选好后猴子跳上第一个踏板后,就可以把它解锁了。因为我没有实现这个方法,所以我只展示这些。

我觉得他的缺点在于:
1、需要较多的变量来封装。运用的数据结构也比较多。
2、我在一开始尝试之后失败了,后来我发现了原因是我总是忘记unlock。

我觉得他的优点在于:
1、较好理解,手动的上锁比较自由。
2、数据结构较多但并不复杂,可以从中较容易地获得对象的状态

我主要讲述我使用的线程池吧
二、线程池
线程池就是首先创建一些线程,它们的集合称为线程池。使用线程池可以很好地提高性能,线程池在系统启动时即创建大量空闲的线程,程序将一个任务传给线程池,线程池就会启动一条线程来执行这个任务,执行结束以后,该线程并不会死亡,而是再次返回线程池中成为空闲状态,等待执行下一个任务。

申请:
申请的变量
那么线程从哪里创建呢,我是从构建新的猴子对象的时候就开始启动线程的,用到库的方法execute:
创建线程
当线程创建完毕,运行完之后暂时挂起。
等所有线程结束后,关闭线程池:
关闭线程池的方法
因为实验要求不是很多,所以用到的方法很简单。

我觉得他的优点在于:
方便操作,运行快速。因为他的线程一旦结束,就会自动挂起,等待下一个线程。这不仅节省了时间也节省了空间。

作为新手还没有很多经验发现它的缺点。希望可以有大佬指点!

很重要的是,由于学习的不是精细,如果有用词及术语不当的地方,还请多加指正!

这里贴出一个有关于ExecutorService的帖子,其中介绍了很多的方法。另外还给出来其他多线程的方法模式:
https://blog.csdn.net/hnd978142833/article/details/80253784

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值