java多线程的深入分析

Posted zhaoyuwei

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java多线程的深入分析相关的知识,希望对你有一定的参考价值。

1.进程与线程的区别

    1.1 进程通常是指一个应用程序,进程的启动就意味着该改程序的主线程启动,不同的进程拥有这不同的内存空间,而不同的线程有共享的内存空间,一个进程包含多个线程

2.java中如何创建线程

    2.1 继承Thread类

    2.2 实现Runnable接口

3.线程中run()与start()的区别

    3.1 run方法是指一个线程要执行的内容

    3.2 start方法是指将线程的状态变成就绪状态,线程是否执行是取决于cup的调度

4.线程中的调度

    4.1 sleep方法:线程休眠多长时间

    4.2 join方法: 等待join方法的线程变成消亡状态

    4.3 setPriority方法:设置线程的优先级,值越大 获取cup调度的资源就越大

    4.4 yeild方法:线程让步,让当前线程变成就绪状态,虽然说是让步但是很有可能立即执行

    4.5 stop方法:强制停止当前线程,但是这样做不安全,因此jdk标记成了过时方法

    4.6 interrupt方法:优雅停止线程(设置一个可以停止线程的信号,实际上停止与否应该看线程所执行的业务结果可以通过isinterrupt来判断当前线程是否可以停止)

5.线程的状态

    技术分享图片

 

6.并行于并发

  6.1 并行真正的意义上的同时执行

  6.2 通过CPU的调度,同一时刻只有一个线程执行

7.并发带来的问题

   多线程,原子,可见,有序,详细讲解:

    7.1 原子性:同一个线程在执行的的时候不能被其他线程打断

    7.2 可见性:当线程改变一个值后一定要让其他线程看到最新的结果 volitile:可见性关键字,保证线程一定能够获取到主内存最新更改的值

    7.3 即程序执行的顺序按照代码的先后顺序执行

8.wait于sleep的区别

   1: wait是Object里边的发方法,sleep是Thread的方法

   2: wait会自动释放锁,sleep不会

   3: wait必须配合sychronized关键字一起使用

9.实现死锁

package com.zhibo.zyw.bdnq.test;
import com.zhibo.zyw.bdnq.test.DeadLock.*;
/**
 * @program: ThreadProject
 * @author: zyw
 * @create: 2018-06-26 18:14
 **/
public class ProducerAndConsumer {


    public static void main(String[] args) {

        Thread thread1 = new Thread(new DeadLockThread(true));
        Thread thread2 = new Thread(new DeadLockThread(false));
        thread1.start();
        thread2.start();
    }
}
package com.zhibo.zyw.bdnq.test;

/**
 * @program: ThreadProject
 * @author: zyw
 * @create: 2018-06-26 18:22
 **/
public class DeadLock {
    private static Object monitor1 = new Object();
    private static Object monitor2 = new Object();

    public static class DeadLockThread implements Runnable {

        private boolean type;

        public DeadLockThread(boolean type) {
            this.type = type;
        }

        @Override
        public void run() {
            if (type) {
                synchronized (monitor1) {
                    try {
                        Thread.sleep(1000);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
                synchronized (monitor2) {

                }
            } else {
                synchronized (monitor2) {
                    try {
                        Thread.sleep(1000);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
                synchronized (monitor1) {

                }
            }
        }
    }
}

 

 

 今天小编就先写到这里,有什么疑问的可以留言欧!

 

以上是关于java多线程的深入分析的主要内容,如果未能解决你的问题,请参考以下文章

Java 多线程深入分析

java多线程--------深入分析 ThreadLocal 内存泄漏问题

Java异步编程——深入源码分析FutureTask

Java线程池详解

java线程基础巩固---wait和sleep的本质区别是什么,深入分析(面试常见问题)

07深入理解Java线程池