多线程总结

多线程总结

1.多线程的实现:

  1. 方法一 : 继承类: Thread 让定义的类通过extends Thread类来实现多线程.
  2. 方法二 : 实现接口: Runnable 让定义的类通过implment Runnalble来实现多线程.
  3. 由于java语言特性 , 只允许单继承,所以只能继承Thread类 , 但是可以实现多接口啊,所以首选方法就是方法二是比较好的.
  4. Thread中的方法比较多,首先就是所需任务必须通过覆写run方法,其次就是start , sleep(休眠需要配合 try catch使用) , join(用来执完当前线程再去申请结束下一个线程).
  5. 申请线程时可以直接使用线程池来申请

(ExecutorService executor = Executors.newFixedThreadPool(THREAD_COUNT))

thread代码demo

    package collection.concurrency.multithread;
    
    public class Runner {
        public static void main(String[] args) {
            Thread t1 = new Thread(new BasicRunnable(),"t1");
            Thread t2 = new Thread(new BasicRunnable(),"t2");
            System.out.println("APP Start " + Thread.currentThread().getName());
            System.out.println("starting runnble threads");
            t1.start();
            t2.start();
            System.out.println("runnble threads has started");
        Thread t3 =new BasicThread("t3");
        Thread t4 =new BasicThread("t4");
        t3.start();
        t4.start();
        System.out.println("All runnble threads has started");
    }
}

    package collection.concurrency.multithread;
    
    public class BasicThread extends Thread {
        public BasicThread(String name) {
            super(name);
        }

    @Override
    public void run() {
        System.out.println("RUNNING START" + Thread.currentThread().getName()); //currentthread为主线程
        try {
            Thread.sleep(1000);
            Processing();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println("RUNNABLE END" + Thread.currentThread().getName());

    }

    private void Processing() throws InterruptedException {
        System.out.println("PROCESSING....");
        Thread.sleep(5000);
    }

}

1.死锁问题

  • 个人理解 : 就是由于多线程的原因 , 操作同一对象时会产生冲突 , 譬如 : 两个人玩两块积木时 , 各自都持有不同的并且还都想要对方手上的积木 , 此时死锁产生 , 如果不解决此问题的话程序会产生错误.

  • 解决方法 : 此时就需要在编程时加上 synchronized , 可以在对象上加,也可以在方法上加

    `package collection.concurrency.multithread;

    static BasicMethodSync instance = new BasicMethodSync();
     static int i = 0;
    
     /*private static synchronized void increase(){
         i++;
     }*/
     private static synchronized void increase(){
         i++;
     }
    
     @Override
     public void run() {
         for (int j = 0;j < 2000000;j++){
             increase();
         }
     }
    
     public static void main(String[] args) throws InterruptedException {
         Thread t1 = new Thread(new BasicMethodSync());
         Thread t2 = new Thread(new BasicMethodSync());
         Thread t3 = new Thread(new BasicMethodSync());
         long prev = System.currentTimeMillis();
         t1.start();
         t2.start();
         t3.start();
         t1.join();
         t2.join();
         t3.join();
         long cyr = System.currentTimeMillis();
         //  System.out.println(i);
         System.out.println("Final result: " + i);
         System.out.println("Time used " + (cyr - prev));
     }
    

    }

`

  • 解决方法二 : lock方法,只需要先 public static ReentrantLock lock = new ReentrantLock(); . 在具体代码中使用时

     lock.lock;
     try {
         i++;
     }
     finally {
         lock.unlock();
     }
    

将申请的lock在使用前加上lock锁上就可以,执行完再unlock解锁就行了 , 还有中stampslock , 这种使用起来比这种话reentrantlock更功能强大.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值