Java并行

2017-10-24  本文已影响7人  Magicknight

并行的2个模型

  1. 共享内存
  2. 消息通信

进程和线程的区别

进程拥有私有的内存区域(现代处理器可以使得进程有共享的内存区域),进程代表虚拟计算机;同一个进程中的线程之间是共享内存区域的,线程代表虚拟进程,线程比进程更有效率,进程需要保存大量的数据。在线程数大于CPU内核数数,线程是通过CPU的时间分片控制的执行的。

JAVA运行线程的两种方式

  1. 实现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();

    }   
}
  1. 声明线程子类的方法(不要使用)
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");
    }
}


竞争条件导致并行编程是困难的

在并行编程的时候,记得加上锁,也要避免死锁。

  1. 使用synchronized关键字加锁
    下面看一个死锁的例子,alphonse的线程占用了gaston对象,gaston的线程占用了alphonse对象,导致两者都在等对方释放,从而导致死锁。死锁出现的原因:

ava 死锁产生的四个必要条件:

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();
    }
}
上一篇下一篇

猜你喜欢

热点阅读