超线程多核心下Java多线程编程分析

超线程多核心下Java多线程编程分析,第1张

超线程多核心下Java多线程编程分析,第2张

1.Java环境下的多线程技术
线程化应用程序的构建往往会给程序带来重要的性能影响。例如,考虑一个从磁盘读取大量数据并在写入屏幕之前对其进行处理的程序(如DVD播放器)。在传统的单线程程序中(今天使用的大多数客户端程序),一次只执行一个任务,每个活动作为一个序列的不同阶段发生。只有在读取了一段规定大小的数据后,才能进行数据处理。因此,在磁盘读取操作完成之前,不会执行可以处理数据的程序逻辑。这将导致非常糟糕的性能问题。

在多线程程序中,可以分配一个线程读取数据,另一个线程处理数据,第三个线程向显卡发送数据。这三个线程可以并行运行;这样磁盘在读取数据的同时仍然可以处理数据,从而提高整个程序的性能。许多示例程序可以设计为同时做两件事,以进一步提高性能。Java虚拟机(JVM)本身就是因为这个原因被广泛使用的。

本文将讨论多线程Java代码的创建以及并行编程的一些练习。此外,还介绍了一些对开发人员非常有用的工具和资源。限于篇幅,无法全面论述这些问题,所以我想只突出最重要的地方,给大家提供相应的参考信息。

第二,线程化的Java代码

所有程序都至少使用一个线程。在C/C++和Java中,这指的是通过调用main()启动的线程。创建另一个线程需要几个步骤:创建一个新线程,然后给它分配某种工作。一旦工作完成,线程将被JVM自动终止。

Java提供了两种创建线程和分配线程工作的方法。第一种方法是子类化Java的Thread类(在java.lang包中),然后用线程的work函数重载run()方法。下面是这种方法的一个例子:

公共类SimpleThread扩展Thread { public simple Thread(String str){ super(str);} public void run(){ for(int I = 0;i < 10i++){ system . out . println(I+" "+getName());试试{ sleep((long)(math . random()* 1000));} catch(interrupted exception e){ } } system . out . println(" DONE!"+getName());}}


这个类子类化Thread并提供自己的run()方法。上面代码中的函数运行一个循环,将传递的字符串打印到屏幕上,然后等待随机的小时数。循环十次后,该函数打印“完成!”然后退出,让它杀死这个线程。下面是创建线程的主要函数:

public class two threads demo { public static void main(String[]args){ new simple thread(" Do it!").start();new SimpleThread("肯定不是!").start();}}


注意,代码极其简单:函数启动,给出一个名称(这是线程将打印出来的字符串)并调用start()。然后,start()将调用run()方法。该方案的结果如下:

0动手吧!0肯定不是!1肯定不是!2肯定不是!1动手吧!2动手吧!3动手吧!3肯定不是!4动手吧!4肯定不是!5动手吧!5肯定不是!6动手吧!7动手吧!6肯定不是!8动手吧!7肯定不是!8肯定不是!9动手吧!搞定了。动手吧!9肯定不是!搞定了。肯定不是!


如您所见,这两个线程的输出结果是组合在一起的。在单线程程序中,所有的“做吧!”命令将被一起打印出来,后面是输出“肯定不行!”
此程序的不同运行会产生不同的结果。这种不确定性来自两个方面:周期存在随机停顿;更重要的是,线程执行时间无法保证。这是一个关键原则。JVM将根据自己的时间表运行这些进程(虚拟机一般支持尽可能快地运行这些线程,但不能保证给定的线程何时运行)。对于每个线程,可以关联一个优先级,以确保JVM在次要线程之前处理关键线程。

启动线程的第二种方法是使用一个实现Runnable接口的类——这个接口也在java.lang中定义。这个Runnable接口指定了一个run()方法——然后它成为线程的主要函数,类似于前面的代码。

现在,Java程序的一般风格是支持继承接口。通过使用接口,一个类仍然可以在以后被继承(子类化)——如果需要的话(例如,如果这个类以后被用作applet,就会发生这种情况)。

位律师回复
DABAN RP主题是一个优秀的主题,极致后台体验,无插件,集成会员系统
白度搜_经验知识百科全书 » 超线程多核心下Java多线程编程分析

0条评论

发表评论

提供最优质的资源集合

立即查看 了解详情