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

  • 相关阅读:
    中文字符集编码Unicode ,gb2312 , cp936 ,GBK,GB18030
    深入理解linux i节点(inode)
    汉字区位码、机内码学习笔记
    CSDN密码使用前10名
    GB2312汉字区位码、交换码和机内码转换方法(转)
    我的网名为什么是ma6174????
    解决CHM文档在linux下的乱码问题
    数据结构实验二:栈和队列的基本操作和应用
    精确记算程序的运行时间或者某段代码的运行时间
    键盘、游戏、ASCII码引出的一系列问题
  • 原文地址:https://www.cnblogs.com/flymili1017/p/14538411.html
Copyright © 2020-2023  润新知