线程1
    与线程相关的概念
    线程与进程的区别
    线程创建策略
    线程组
    
    线程创建策略
        并发应用中一般有两种不同的线程创建策略
        1直接控制线程的创建和管理
        2将线程的管理从应用程序中抽象出来作为执行器,应用程序将任务传递给执行器,由执行器负责执行。
线程2
    在线程中实现自己的代码逻辑
    
    有3种方式
        从Thread类继承
        实现runnable接口
        使用方法引用到一个无参数无返回值的方法
        
    将参数传入线程中
        使用线程类属性的set方法
        使用线程类的构造方法传值

 

package java20180203_1;

class Thread1 extends Thread {
    private int num;
    public void setNum(int num) {
        this.num = num;
    }
    @Override
    public void run() {
        for (int i = 0; i < 100; i++) {
            try {
                Thread.sleep(500);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            System.out.println("thread1:" + i+","+num);
        }
    }

}

class Thread2 implements Runnable {
    private int num;
    public Thread2(int num) {
        this.num = num;
    }
    @Override
    public void run() {
        for (int i = 0; i < 100; i++) {
            try {
                Thread.sleep(500);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            System.out.println("thread2:" + i+","+num);
        }
    }
}

public class ThreadDemo {

    static void print(){
        for (int i = 0; i < 100; i++) {
            try {
                Thread.sleep(500);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            System.out.println("thread4:" + i);
        }
    }
    public static void main(String[] args) throws Exception {
        /**
         * 线程组,将线程加入到线程组
         */
        Thread t1 = new Thread();
        t1.start();

        ThreadGroup tg1 = new ThreadGroup("ThreadGroup");
        Thread t2 = new Thread(tg1, "t2");

        /**
         * 从Thread类继承,这是子线程1
         */
        Thread1 th1 = new Thread1();
        //使用线程类set属性进行传值
        th1.setNum(200);
        th1.start();

        /**
         * 实现runnable接口,这是子线程2
         */
        //使用构造方法传值
        Runnable r2 = new Thread2(300);
        Thread t3 = new Thread(r2);
        t3.start();

        /**
         * 用lambda表达式来实现相同的功能,这是子线程3
         */
        new Thread(() -> {
            for (int i = 0; i < 100; i++) {
                try {
                    Thread.sleep(500);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                System.out.println("thread3:" + i);
            }
        }).start();
        
        /**
         * 方法引用来创建线程
         */
        new Thread(ThreadDemo::print).start();
        
        /**
         * 这是main线程的循环
         * 总共有4个线程,一个是main主线程的循环,其余3个是子线程的循环,有3个start,它们是并行的,可以从结果中看到。
         * 分发给不同的处理器来执行
         */
        for (int i = 0; i < 100; i++) {
            Thread.sleep(500);
            System.out.println("main:" + i);
        }
    }
}

 

线程3
    获取线程的信息
    线程优先级
    线程串行化
    线程休眠
    
    获取线程的信息
        currentThread()
        getName
    优先级
        默认优先级是5,子默认与父优先级相同,共10个,从1到10。
    串行化
        若一个线程运行的过程中要用到另一个线程的结果,则可以进行线程的串行化处理
        join()方法
    休眠
        sleep()方法,暂停时间不精确

        
线程4
    线程的状态
    线程中断
    线程停止
    守护线程
    
    
    线程的状态
        可以使用getState()来获取,有New,Runnable,Blocked,Waiting,ThreadWaiting,Dead这6种状态

    线程停止
        开发中使线程停止的方式不是使用其stop(),已经不推荐使用了
        而是使用标识量来停止线程

 

package java20180205;

public class InterruptDemo {

    public static void main(String[] args) throws Exception {
        Thread t1=new Thread(()->{
            for (int i = 0; i < 20; i++) {
                System.out.println(i);
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        });
        t1.start();
        for (int i = 0; i < 20; i++) {
            System.out.println("main:"+i);
            Thread.sleep(300);
        }
        t1.interrupt();
        /**
         * 一个是false,一个是true
         */
//        System.out.println(t1.interrupted());
//        System.out.println(t1.isInterrupted());
    }

}

 

 

package java20180205;

class Thread4 implements Runnable{

    private boolean stop=false;
    public void setStop(boolean stop) {
        this.stop = stop;
    }
    
    @Override
    public void run() {
        for (int i = 0;; i++) {
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            if (stop) {
                break;
            }
            System.out.println(i);
        }
    }
}

public class StopDemo {

    public static void main(String[] args) throws Exception {
//        Thread4 t4=new Thread4();
//        new Thread(t4).start();
//        Thread.sleep(4000);
//        t4.setStop(true);
        
        
        Thread4 t4=new Thread4();
        Thread t5=new Thread(t4);
        t5.setDaemon(true);
        t5.start();
        Thread.sleep(4000);
        
    }
}

 

线程5
    多线程访问共享数据的问题
    java内存模型
        
    案例
        使用多个线程调用一个账号实例中的取款方法
    java内存模型
        线程安全术语

线程6
    对象监视器
    synchronized关键字
    volatile变量
    
    对象监视器
        临界区,监视器上加锁
    
    synchronized关键字
        用于声明临界区
        两种方法:
            synchronized方法
                实例方法:锁加在实例上
                静态方法:锁加在类上
            synchronized块
        
线程7    05:29
    生产者消费者模型
    wait与sleep的区别
    
    生产者消费者模型
        线程间通信的另一种方式,是一个非常经典的模型