189 8069 5689

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://cdxtjz.cn/article/dsssghh.html

其他资讯