美文网首页
Java并行

Java并行

作者: Magicknight | 来源:发表于2017-10-24 11:12 被阅读7次

    并行的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 死锁产生的四个必要条件:

    • 互斥使用,即当资源被一个线程使用(占有)时,别的线程不能使用
    • 不可抢占,资源请求者不能强制从资源占有者手中夺取资源,资源只能由资源占有者主动释放。
    • 请求和保持,即当资源请求者在请求其他的资源的同时保持对原有资源的占有。
    • 循环等待,即存在一个等待队列: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();
        }
    }
    

    相关文章

      网友评论

          本文标题:Java并行

          本文链接:https://www.haomeiwen.com/subject/wlxzuxtx.html