<b>超线程多核心下Java多线程编程技术解析</b>[Java编程]
本文“<b>超线程多核心下Java多线程编程技术解析</b>[Java编程]”是由七道奇为您精心收集,来源于网络转载,文章版权归文章作者所有,本站不对其观点以及内容做任何评价,请读者自行判断,以下是其具体内容:
1、Java环境下的多线程技术
构建线程化的利用程序常常会对程序带来重要的性能影响.比方,请考虑这样一个程序,它从磁盘读取大量数据并且在把它们写到屏幕之前处理这些数据(比方一个DVD播放器).在一个传统的单线程程序(本日所利用的大大都客户端程序)上,一次只有一个任务履行,每一个这些活动辨别作为一个序列的差别阶段发生.只有在一块已定义大小的数据读取完成时才能举行数据处理.因此,能处理数据的程序逻辑直到磁盘读操作完成后才得到履行.这将招致非常差的性能问题.
在一个多线程程序中,可以分配一个线程来读取数据,让另一个线程来处理数据,而让第三个线程把数据运送到图形卡上去.这三个线程可以并行运行;这样以来,在磁盘读取数据的同时仍旧可以处理数据,从而提高了整体程序的性能.很多大量的示例程序都可以被计划来同时做两件事情以进一步提高性能.Java虚拟机(JVM)本身就是基于此缘由遍及利用了多线程技术.
本文将谈论成立多线程Java代码以及一些举行并路程序计划的最好操练;别的还介绍了对开辟者极其有效的一些工具和资源.篇幅所限,不大概全面阐述这些问题,所以我想只是重点提一下极重要的地方并供应应你呼应的参考信息.
2、线程化Java代码
全部的程序都至少利用一个线程.在C/C++和Java中,这是指用对main()的调用而启动的那个线程.别的线程的成立需求若干步骤:成立一个新线程,然后指定给它某种工作.一旦工作做完,该线程将自动被JVM所杀死.
Java供应两个办法来成立线程并且指定给它们工作.第一种办法是子类化Java的Thread类(在java.lang包中),然后用该线程的工作函数重载run()办法.下面是这种办法的一个示例:
public class SimpleThread extends Thread {
public SimpleThread(String str) {
super(str);
}
public void run() {
for (int i = 0; i < 10; i++) {
System.out.println(i + " " + getName());
try {
sleep((long)(Math.random() * 1000));
} catch (InterruptedException e) {}
}
System.out.println("DONE! " + getName());
}
}
这个类子类化Thread并且供应它自己的run()办法.上面代码中的函数运行一个循环来打印传送过来的字符串到屏幕上,然后等候一个随机的时间数目.在循环十次后,该函数打印“DONE!”,然撤退出-并由它杀死这个线程.下面是成立线程的主函数:
public class TwoThreadsDemo {
public static void main (String[] args) {
new SimpleThread("Do it!").start();
new SimpleThread("Definitely not!").start();
}
}
注意该代码极其简单:函数开始,给定一个名字(它是该线程将要打印输出的字符串)并且调用start().然后,start()将调用run()办法.程序的后果以下所示:
0 Do it!
0 Definitely not!
1 Definitely not!
2 Definitely not!
1 Do it!
2 Do it!
3 Do it!
3 Definitely not!
4 Do it!
4 Definitely not!
5 Do it!
5 Definitely not!
6 Do it!
7 Do it!
6 Definitely not!
8 Do it!
7 Definitely not!
8 Definitely not!
9 Do it!
DONE! Do it!
9 Definitely not!
DONE! Definitely not!
正如你所看到的,这两个线程的输出后果纠合到一同.在一个单线程程序中,全部的“Do it!”号令将一同打印,背面随着输出“Definitely not!”.
这个程序的差别运行将产生差别的后果.这种不肯定性根源于两个方面:在循环中有一个随机的暂停;更为重要的是,因为线程履行时间没法保证.这是一个关键的原则.JVM将按照它自己的时间表运行这些进程(虚拟机普通支持尽大概快地运行这些线程,但是没法保证什么时刻运行一个给定线程).关于每个线程可以使一个优先级与之相关联以确保关键线程被JVM处理在次要的线程之前.
启动一个线程的第二种办法是利用一个实现Runnable接口的类-这个接口也定义在java.lang中.这个Runnable接口指定一个run()办法-然后该办法成为线程的主函数,近似于前面的代码.
目前,Java程序的普通气势是支持担当的接口.通过利用接口,一个类在背面仍旧可以担当(子类化)-假如必要的话(比方,假如该类要在背面作为一个applet利用的话,就会发生这种情形).
以上是“<b>超线程多核心下Java多线程编程技术解析</b>[Java编程]”的内容,如果你对以上该文章内容感兴趣,你可以看看七道奇为您推荐以下文章:
本文地址: | 与您的QQ/BBS好友分享! |