java并行执行代码,java多线程并行执行
Java 多线程程序。java先执行主程序,并行执行线程?调用线程的结果是空
java创建的线程在调用start方法后,进入就绪状态,但通常不会马上分配到CPU,处于线程就绪队列,需要等待时间片轮转到该线程获得CPU后才能执行。
我们提供的服务有:成都网站建设、成都做网站、微信公众号开发、网站优化、网站认证、谢通门ssl等。为超过千家企事业单位解决了网站和推广的问题。提供周到的售前咨询和贴心的售后服务,是有科学管理、有技术的谢通门网站制作公司
如果你需要先执行新的线程,可以使用Thread类的join方法来等待该线程终止后,再继续往下执行,下面举个代码例子:
public class Test {
int i = 0;
public static void main(String[] args) {
Test test = new Test();
MyThread1 myThread = new MyThread1(test);
Thread thread = new Thread(myThread);
thread.start();
try {
thread.join();//如果不调用此方法,打印结果为0
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println(test.i);
}
}
class MyThread1 implements Runnable{
Test test;
public MyThread1(Test test){
this.test = test;
}
@Override
public void run() {
test.i = 1;
}
}
JAVA中的多线程能在多CPU上并行执行吗?注意,我说的不是并发执行哦
你的思路是对的,CPU就是为了迎合操作系统的多线程从而提高系统的计算效率.但是具体分配任务到各个内核中去执行的并非JAVA与JVM而是操作系统.也就是说,你所执行的多线程,可能会被分配到同一个CPU内核中运行.也可能非配到不同的cpu中运行.如果可以控制CPU的分配,那也应该是操作系统的api才能实现的了
java实现两个线程,一个打印奇数,一个打印偶数,这两个线程如何并发执行?
package test;
public class Test33{
private static int state = 1;
private static int num1 = 1;
private static int num2 = 2;
public static void main(String[] args) {
final Test33 t = new Test33();
new Thread(new Runnable() {
@Override
public void run() {
while(num1100){
//两个线程都用t对象作为锁,保证每个交替期间只有一个线程在打印
synchronized (t) {
// 如果state!=1, 说明此时尚未轮到线程1打印, 线程1将调用t的wait()方法, 直到下次被唤醒
if(state!=1){
try {
t.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
// 当state=1时, 轮到线程1打印5次数字
for(int j=0; j1; j++){
System.out.println(num1);
num1 += 2;
}
// 线程1打印完成后, 将state赋值为2, 表示接下来将轮到线程2打印
state = 2;
// notifyAll()方法唤醒在t上wait的线程2, 同时线程1将退出同步代码块, 释放t锁
t.notifyAll();
}
}
}
}).start();
new Thread(new Runnable() {
@Override
public void run() {
while(num2100){
synchronized (t) {
if(state!=2){
try {
t.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
for(int j=0; j1; j++){
System.out.println(num2);
num2 += 2;
}
state = 1;
t.notifyAll();
}
}
}
}).start();
}
}
java如何多线程并发执行?
把对这个list的check行为放到一个多线程里面去做.这样当执行这个方法的时候.程序就会立刻返回,也就可以去处理其他事情了.线程会在后台执行.
不要把每个check都用一个线程,这样的并发问题,是非常复杂.
public void method(){
Thread t = new Thread() {
@Override
public void run() {
//dosomething
//线程在后台执行你想执行的东西
}
};
t.start();
//该方法执行后,立刻返回,让程序得意执行其他操作
}
如何提高Java并行程序性能
在Java程序中,多线程几乎已经无处不在。与单线程相比,多线程程序的设计和实现略微困难,但通过多线程,却可以获得多核CPU带来的性能飞跃,从这个角度说,多线程是一种值得尝试的技术。
1.有关多线程的误区:线程越多,性能越好
不少初学者可能认为,线程数量越多,那么性能应该越好。因为程序给的直观感受总是这样。一个两个线程可能跑的很难,线程一多可能就快了。但事实并非如此。因为一个物理CPU一次只能执行一个线程,多个线程则意味着必须进行线程的上下文切换,而这个代价是很高的。因此,线程数量必须适量,最好的情况应该是N个CPU使用N个线程,并且让每个CPU的占有率都达到100%,这种情况下,系统的吞吐量才发挥到极致。但现实中,不太可能让单线程独占CPU达到100%,一个普遍的愿意是因为IO操作,无论是磁盘IO还是网络IO都是很慢的。线程在执行中会等待,因此效率就下来了。这也就是为什么在一个物理核上执行多个线程会感觉效率高了,对于程序调度来说,一个线程等待时,也正是其它线程执行的大好机会,因此,CPU资源得到了充分的利用。
2.尽可能不要挂起线程
多线程程序免不了要同步,最直接的方法就是使用锁。每次只允许一个线程进入临界区,让其它相关线程等待。等待有2种,一种是直接使用操作系统指令挂起线程,另外一种是自旋等待。在操作系统直接挂起,是一种简单粗暴的实现,性能较差,不太适用于高并发的场景,因为随之而来的问题就是大量的线程上下文切换。如果可以,尝试一下进行有限的自旋等待,等待不成功再去挂起线程也不迟。这样很有可能可以避免一些无谓的开销。JDK中ConcurrentHashMap的实现里就有一些自旋等待的实现。此外Java虚拟机层面,对synchronized关键字也有自旋等待的优化。
3.善用“无锁”
阻塞线程会带来性能开销,因此,一种提供性能的方案就是使用无锁的CAS操作。JDK中的原子类,如AtomicInteger正是使用了这种方案。在高并发环境中,冲突较多的情况下,性能远远好于传统的锁操作。
4.处理好“伪共享”问题
CPU有一个高速缓存Cache。在Cache中,读写数据的最小单位是缓存行,如果2个变量存在一个缓存行中,那么在多线程访问中,可能会相互影响彼此的性能。因此将变量存放于独立的缓存行中,也有助于变量在多线程访问是的性能提升,大量的高并发库都会采用这种技术。
分享名称:java并行执行代码,java多线程并行执行
网页路径:http://ybzwz.com/article/dsssghh.html