Java线程使用

关于线程是Java语言中很重要的一块,在程序中有很多地方也使用线程。但是真正考虑如何在适合的场合使用线程呢?采用线程最明显的就是用于异步操作处理。那么为何要使用异步方式呢?

先来介绍下为什么有了进程,还需要线程。

第一:并行实体共享同一个地址空间和所有可用数据的能力。

第二:线程比进程更轻量级,比进程更容易创建,也更容易撤销。

第三:主要是涉及性能方面。

 

关于性能又涉及到线程的行为,几乎所有的线程I/O活动或计算都是交替突发的(对进程而言也是类似)。这里所说的I/O活动不是一般的磁盘读写处理,而是当一个线程等待外部设备完成工作而被阻塞时,才是I/O活动。这里要注意,某些I/O活动可以看作是计算,例如,当CPU向视频RAM复制数据以更新屏幕时,因为使用了CPU,所以这是计算,而不是I/O活动。

一般花费了绝大多数时间在计算上面叫计算密集型(也叫CPU密集型),一般在等待I/O上花费了绝大多数时间叫I/O密集型。若多个线程都是CPU密集型的,那么并不能获得性能上的增强,但是如果存在着大量的计算和大量的I/O处理,拥有多个线程允许这些活动彼此重叠进行,那么会加快应用程序的执行速度。

另外从JVM角度出发,线程的切换也是要花代价的,而且线程的优先级并不是特别有效(像windows和liunx的线程优先级有很多等级)。Java线程的调度还是需要人工控制,不然在并发高峰时,还是会出现部分线程抢占不到CPU,而不能运行。

随着多核的到来,多线程也更适合进行CPU密集型的处理,打个比方,用一个线程来计算一系列数组[1,3,4,52,343,32,6,……,4]的最大值,还是用多个线程来计算。谁的速度快,不得而知(大家也可测试下)。不过矩阵运算或者科学计算时,多核是比较具有优势。

总之线程是一个比较复杂的概念,涉及通信、锁、调度、多线程设计模式几个方面,这些知识也很重要(以后会在博客里提到)。

 

最后额外说下进程与程序的区别,虽然很微妙,但非常重要。用一个比喻可以使我们更容易理解这点。假设一个厨师正在做生日蛋糕。他有做生日蛋糕的食谱,所需要的原料:面粉、鸡蛋、糖等。做蛋糕的食谱就是程序,厨师就是处理器(CPU),而作蛋糕的各种原料就是输入数据。进程就是厨师阅读食谱、取来各种原料及烘制蛋糕等一系列动作的总和。

 

 

 

 

 

 

1. 建立三个线程,并且同时运行它们。当运行时输出线程的名称。 实验步骤: (1)、创建类sy6_1 (2)、创建三个线程,调用start()方法启动这三个线程 (3)、保存文件,调试并编译运行程序。 参考程序运行效果: 2. 实现3个类:Storage、Counter和Printer。 Storage类应存储整数。 Counter应创建线程线程从0开始计数(0,1,2,3…)并将每个值存储到Storage类中。 Printer类应创建一个线程线程读取Storage类中的值并打印值。编写程序创建Storage类的实例,并创建一个Counter对象和Printer对象操作此实例。 实验步骤: (1)、创建三个类Counter, Printer,Storage (2)、创建TestCounter类,在该类中定义main函数,在main函数中定义Storage对象、Counter对象和 Printer对象,创建Counter线程和Printer线程并启动 (3)、保存文件,调试并编译运行程序。 参考程序运行效果: 3. 修改实验1第2题的程序,添加适当代码,以确保每个数字都恰好只被打印一次。 实验步骤: (1)、创建三个类Counter, Printer,Storage (2)、 创建TestCounter类,在该类中定义main函数,在main函数中定义Storage对象、Counter1对象和 Printer对象,创建Counter线程和Printer线程并启动 (3)、在定义Storage类中的setValue(int i) 和getValue ()方法时使用synchronized关键字,将其定义为同步方法 (4)、保存文件,调试并编译运行程序。 参考程序运行效果:
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值