Java并行
2017-10-24 本文已影响7人
Magicknight
并行的2个模型
- 共享内存
- 消息通信
进程和线程的区别
进程拥有私有的内存区域(现代处理器可以使得进程有共享的内存区域),进程代表虚拟计算机;同一个进程中的线程之间是共享内存区域的,线程代表虚拟进程,线程比进程更有效率,进程需要保存大量的数据。在线程数大于CPU内核数数,线程是通过CPU的时间分片控制的执行的。
JAVA运行线程的两种方式
- 实现Runnable接口方法(推荐)
public class Crack extends Thread{
public static void main(String[] args) {
// TODO Auto-generated method stub
(new Thread(new Crack())).start();
}
@Override
public void run() {
// TODO Auto-generated method stub
System.out.println("my name is thread");
}
}
还有一种匿名的方式来使用Runnable接口
public class Crack {
public static void main(String[] args) {
// TODO Auto-generated method stub
new Thread(new Runnable() {
public void run() {
System.out.println("my name is thread");
}
}).start();
}
}
- 声明线程子类的方法(不要使用)
public class Crack extends Thread{
public static void main(String[] args) {
// TODO Auto-generated method stub
(new Crack()).start();
}
@Override
public void run() {
// TODO Auto-generated method stub
System.out.println("my name is thread");
}
}
竞争条件导致并行编程是困难的
在并行编程的时候,记得加上锁,也要避免死锁。
- 使用synchronized关键字加锁
下面看一个死锁的例子,alphonse的线程占用了gaston对象,gaston的线程占用了alphonse对象,导致两者都在等对方释放,从而导致死锁。死锁出现的原因:
ava 死锁产生的四个必要条件:
- 互斥使用,即当资源被一个线程使用(占有)时,别的线程不能使用
- 不可抢占,资源请求者不能强制从资源占有者手中夺取资源,资源只能由资源占有者主动释放。
- 请求和保持,即当资源请求者在请求其他的资源的同时保持对原有资源的占有。
- 循环等待,即存在一个等待队列:P1占有P2的资源,P2占有P3的资源,P3占有P1的资源。这样就形成了一个等待环路。
public class Deadlock {
static class Friend {
private final String name;
public Friend(String name) {
this.name = name;
}
public String getName() {
return this.name;
}
public synchronized void bow(Friend bower) {
System.out.format("%s: %s"
+ " has bowed to me!%n",
this.name, bower.getName());
bower.bowBack(this);
}
public synchronized void bowBack(Friend bower) {
System.out.format("%s: %s"
+ " has bowed back to me!%n",
this.name, bower.getName());
}
}
public static void main(String[] args) {
final Friend alphonse =
new Friend("Alphonse");
final Friend gaston =
new Friend("Gaston");
new Thread(new Runnable() {
public void run() { alphonse.bow(gaston); }
}).start();
new Thread(new Runnable() {
public void run() { gaston.bow(alphonse); }
}).start();
}
}