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()会释放锁。

 

posted @ 2021-03-15 16:34  哒哇哩嘻  阅读(19)  评论(0编辑  收藏  举报