码迷,mamicode.com
首页 > 编程语言 > 详细

Java多线程详解(四)------复习

时间:2020-09-18 00:09:42      阅读:28      评论:0      收藏:0      [点我收藏+]

标签:今天   pack   对象   匿名内部类   rtu   notify   xtend   override   条件   

1、线程状态

Thread.State
 
 
 
public enum State {
    /**
     * Thread state for a thread which has not yet started.
     */
    NEW,(新建)

    /**
     * Thread state for a runnable thread.  A thread in the runnable
     * state is executing in the Java virtual machine but it may
     * be waiting for other resources from the operating system
     * such as processor.
     */
    RUNNABLE,(准备就绪)

    /**
     * Thread state for a thread blocked waiting for a monitor lock.
     * A thread in the blocked state is waiting for a monitor lock
     * to enter a synchronized block/method or
     * reenter a synchronized block/method after calling
     * {@link Object#wait() Object.wait}.
     */
    BLOCKED,(阻塞)

    /**
     * Thread state for a waiting thread.
     * A thread is in the waiting state due to calling one of the
     * following methods:
     * <ul>
     *   <li>{@link Object#wait() Object.wait} with no timeout</li>
     *   <li>{@link #join() Thread.join} with no timeout</li>
     *   <li>{@link LockSupport#park() LockSupport.park}</li>
     * </ul>
     *
     * <p>A thread in the waiting state is waiting for another thread to
     * perform a particular action.
     *
     * For example, a thread that has called <tt>Object.wait()</tt>
     * on an object is waiting for another thread to call
     * <tt>Object.notify()</tt> or <tt>Object.notifyAll()</tt> on
     * that object. A thread that has called <tt>Thread.join()</tt>
     * is waiting for a specified thread to terminate.
     */
    WAITING,(不见不散)

    /**
     * Thread state for a waiting thread with a specified waiting time.
     * A thread is in the timed waiting state due to calling one of
     * the following methods with a specified positive waiting time:
     * <ul>
     *   <li>{@link #sleep Thread.sleep}</li>
     *   <li>{@link Object#wait(long) Object.wait} with timeout</li>
     *   <li>{@link #join(long) Thread.join} with timeout</li>
     *   <li>{@link LockSupport#parkNanos LockSupport.parkNanos}</li>
     *   <li>{@link LockSupport#parkUntil LockSupport.parkUntil}</li>
     * </ul>
     */
    TIMED_WAITING,(过时不候)

    /**
     * Thread state for a terminated thread.
     * The thread has completed execution.
     */
    TERMINATED;(终结)
}
 
 

 2、wait/sleep的区别

wait/sleep
功能都是当前线程暂停,有什么区别?
wait放开手去睡,放开手里的锁
sleep握紧手去睡,醒了手里还有锁

3、什么是并发?什么是并行?

并发:同一时刻多个线程在访问同一个资源,多个线程对一个点
例子:小米9今天上午10点,限量抢购
春运抢票
电商秒杀...
并行:多项工作一起执行,之后再汇总
例子:泡方便面,电水壶烧水,一边撕调料倒入桶中

 4、什么是锁

技术图片

 

 

 锁实现提供了比使用同步方法和语句可以获得的更广泛的锁操作。它们允许更灵活的结构,可能具有非常不同的属性,并且可能支持多个关联的条件对象。

 1 class X {
 2    private final ReentrantLock lock = new ReentrantLock();
 3    // ...
 4  
 5    public void m() {
 6      lock.lock();  // block until condition holds
 7      try {
 8        // ... method body
 9      } finally {
10        lock.unlock()
11      }
12    }
13  }
14  
15  
16 synchronized与Lock的区别 
17  
18 两者区别:
19 1.首先synchronized是java内置关键字,在jvm层面,Lock是个java类;
20 2.synchronized无法判断是否获取锁的状态,Lock可以判断是否获取到锁;
21 3.synchronized会自动释放锁(a 线程执行完同步代码会释放锁 ;b 线程执行过程中发生异常会释放锁),Lock需在finally中手工释放锁(unlock()方法释放锁),否则容易造成线程死锁;
22 4.用synchronized关键字的两个线程1和线程2,如果当前线程1获得锁,线程2线程等待。如果线程1阻塞,线程2则会一直等待下去,而Lock锁就不一定会等待下去,如果尝试获取不到锁,线程可以不用一直等待就结束了;
23 5.synchronized的锁可重入、不可中断、非公平,而Lock锁可重入、可判断、可公平(两者皆可)
24 6.Lock锁适合大量同步的代码的同步问题,synchronized锁适合代码少量的同步问题。

 

5、创建线程的方式

  1)继承Thread类

 1 package com.study.thread;
 2 
 3 public class ThreadTest {
 4     public static void main(String[] args) {
 5         for(int i=0;i<10;i++){
 6             //继承Thread类,覆写run()方法,创建多线程
 7             ThreadDemo t = new ThreadDemo();
 8             t.start();
 9         }
10 
11     }
12 }
13 class ThreadDemo extends Thread{
14     @Override
15     public void run(){
16         System.out.println("hello world");
17     }
18 }

  2)实现Runnable接口

 1 package com.study.thread;
 2 
 3 public class ThreadTest {
 4     public static void main(String[] args) {
 5         for (int i = 0; i < 10; i++) {
 6             //继承Thread类,覆写run()方法,创建多线程
 7 //            ThreadDemo t = new ThreadDemo();
 8 //            t.start();
 9             Thread t = new Thread(new RunnableDemo());
10             t.start();
11         }
12 
13     }
14 }
15 
16 class ThreadDemo extends Thread {
17     @Override
18     public void run() {
19         System.out.println("hello world");
20     }
21 }
22 
23 class RunnableDemo implements Runnable {
24 
25     @Override
26     public void run() {
27         System.out.println("hello Runnable");
28     }
29 }

  3)用匿名内部类方式

 1 public class ThreadTest {
 2     public static void main(String[] args) {
 3         for (int i = 0; i < 10; i++) {
 4             //继承Thread类,覆写run()方法,创建多线程
 5 //            ThreadDemo t = new ThreadDemo();
 6 //            t.start();
 7 //            Thread t = new Thread(new RunnableDemo());
 8 //            t.start();
 9             new Thread(new Runnable() {
10                 @Override
11                 public void run() {
12                     System.out.println("hello 匿名内部类");
13                 }
14             }).start();
15         }
16 
17     }
18 }

 

总结:上诉3种方式中,1和2都要new对象出来(浪费内存),3是直接new接口,推荐使用第3种方式。

 

Java多线程详解(四)------复习

标签:今天   pack   对象   匿名内部类   rtu   notify   xtend   override   条件   

原文地址:https://www.cnblogs.com/zsy-code/p/13662426.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!