zoukankan      html  css  js  c++  java
  • java多线程

    一、创建线程的方式:4种

      1、子类继承thread类,重写run()方法,创建子类对象,调用start方法。

      (start作用:①启动当前线程,②调用run()方法)、 

    class MyThread extends Thread{
        public void run() {}
    }
    
    MyTread myThread = new MyThread();
          myThread.start();

      2、类实现Runnable接口,重写run()方法。

    1 class MyThread implements Runnable{
    2     public void run() {}
    3 }
    4 
    5 MyThread myThread = new MyThread();
    6         new Thread(myThread).start();

    3、实现Callable接口

    class CallThread implements Callable{
        @Override
        public Object call() throws Exception {
            return null
        }
    }
    
    CallThread callThread = new CallThread();
            FutureTask futureTask = new FutureTask(callThread);
            new Thread(futureTask).start();

    4、创建线程池

    class NumberThread implements Runnable{
        @Override
        public void run() {}
    } 
    
    ExecutorService service = newFixedThreadPool(10);
          ThreadPoolExecutor service1 = (ThreadPoolExecutor) service;
          service1.setCorePoolSize(10);
          service1.setMaximumPoolSize(10);
          service.execute(new NumberThread());
          service.shutdown();

     

    线程的分类:用户线程、守护线程

    二、线程的生命周期:创建、就绪、运行、阻塞、死亡
    三、解决线程安全方式:3种,同步方法、同步代码块、ReentrantLock

    同步代码块:synchronized

    synchronized和lock的异同:

    相同:都能解决线程安全问题

    不同:synchronized机制在执行完相应的同步代码后,自动释放同步监视器;lock需要手动的启动同步,手动结束同步。

    优先使用顺序:

    lock→同步代码块→同步方法

     

    四、线程通讯涉及到的三个方法:wait(),notify(),notifyall()

    wait():一旦执行此方法,当前线程就进入阻塞状态,并释放同步监视器。

    notify():一旦执行此方法,就会唤醒被wait的一个线程,如果多个线程被wait,就唤醒优先级高的线程。

    notify():一旦执行此方法,就会唤醒所有被wait的线程。

    wait()、notify()、notifyall()调用者必须是同步代码块或同步方法中的同步监视器。

    wait()和slee的异同?

    1、相同点:一点执行方法,都可以使得当前的线程进入阻塞状态

    2、不同点:①两个方法声明的位置不同:Thread类中声明sleep(),Object类中声明wait();

    ②调用的要求不同:sleep()可以在任何需要的场景下调用。wait()必须使用在同步代码块或同步方法中。

    ③关于是否释放同步监视器:如果两个方法都在同步代码块或给同步方法中,sleep()不会释放锁,wait()会释放锁。

  • 相关阅读:
    网络文件传输方式
    ETL利器Kettle
    oracle 字符处理
    ORACLE临时表空间
    Count(*)或者Count(1)或者Count([列]) 区别
    Oracle trunc()函数的用法
    DATE 日期格式
    oracle 异常
    物化视图
    域名和端口
  • 原文地址:https://www.cnblogs.com/flymili1017/p/14538411.html
Copyright © 2011-2022 走看看