自定义线程类继承Tread类
重写run()方法,编写线程执行体
创建线程对象,调用start()方法启动线程
举例
//创建线程方式一:继承Thread类,重写run()方法,调用start开启线程
//总结:线程开启不一定立即执行,由CUP调度执行
public class TestThread1 extends Thread{
    @Override
    public void run() {
        //run方法线程体
        for (int i = 0; i < 2000; i++) {
            System.out.println("我在看代码...." + i);
        }
    }
    public static void main(String[] args) {
        //创建一个线程对象
        TestThread1 testThread1 = new TestThread1();
        //调用start()方法开启线程
        testThread1.start();
        //main线程,主线程
        for (int i = 0; i < 2000; i++) {
            System.out.println("我在学习多线程" + i);
        }
    }
}
定义MyRunnable类实现Runnable接口
实现run()方法,编写线程执行体
创建线程对象,调用start()方法启动线程
//
public class TreadRunn implements Runnable {
    @Override
    public void run() {
        //run方法线程体
        for (int i = 0; i < 200; i++) {
            System.out.println("我在看代码。。。" + i );
        }
    }
    public static void main(String[] args) {
        //创建runnable接口的实现类对象
        TreadRunn treadRunn = new TreadRunn();
        //创建线程对象,通过线程对象来开启我们的线程,代理
//        Thread thread = new Thread(treadRunn);
//        thread.start();
        new Thread(treadRunn).start();
        for (int i = 0; i < 1000; i++) {
            System.out.println("我在学习多线程..." + i);
        }
    }
发现问题
//多个线程同时操作同一个对象
//买火车票的例子
//发现问题:多个线程操作同一个资源的情况下,线程不安全,数据紊乱
public class TestThread4 implements   Runnable{
    //票数
    private int ticketNums = 10;
    @Override
    public void run() {
        while(true){
            if (ticketNums <=0){
                break;
            }
            //模拟延时
            try {
                Thread.sleep(200);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            System.out.println(Thread.currentThread().getName() + "拿到了第" + ticketNums-- + "票");
        }
    }
    public static void main(String[] args) {
        TestThread4 ticket = new TestThread4();
        new Thread(ticket,"小明").start();
        new Thread(ticket,"老师").start();
        new Thread(ticket,"黄牛").start();
    }
}
龟兔赛跑
public class Race implements Runnable{
    //胜利者
    private static String winner;
    @Override
    public void run() {
        for (int i = 0; i <= 100; i++) {
            //模拟兔子休息
            if (Thread.currentThread().getName().equals("兔子") && i % 10 == 0){
                try {
                    Thread.sleep(10);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
            //判断比赛是否结束
            boolean flag =gameOver(i);
            //如果比赛结束了,就停止程序
            if (flag){
                break;
            }
            System.out.println(Thread.currentThread().getName() + "跑了" + i + "步");
        }
    }
    //判断是否完成比赛
    private boolean gameOver(int steps){
        //判断是都有胜利者
        if (winner!= null){//已经存在胜利者了
            return true;
        }{
            if (steps >= 100){
                winner = Thread.currentThread().getName();
                System.out.println("winner is " + winner);
                return true;
            }
        }
        return false;
    }
    public static void main(String[] args) {
        Race race = new Race();
        new Thread(race,"兔子").start();
        new Thread(race,"乌龟").start();
    }
}
为什么使用Lambda表达式
理解Functional Interface(函数式接口)是学习Java8 lambda表达式的关键所在
函数式接口的定义:
其实质属于函数式编程的概念
语句
new Thread (() ->System.out.println("多线程学习....")).start
举例
public class TestLambda {
    //3.静态内部类
    static class Like2 implements ILike{
        @Override
        public void lambda() {
            System.out.println(" i like lambda2");
        }
    }
    public static void main(String[] args) {
        ILike like  = new Like();
        like.lambda();
        like = new Like2();
        like.lambda();
        //4.局部内部类
        class Like3 implements ILike{
            @Override
            public void lambda() {
                System.out.println(" i like lambda3");
            }
        }
        like = new Like3();
        like.lambda();
        //5.匿名内部类:没有内部类,必须借助接口或者父类
        like = new ILike() {
            @Override
            public void lambda() {
                System.out.println(" i like lambda4");
            }
        };
        like.lambda();
        //6.用lambda简化
        like = () -> {
            System.out.println(" i like lambda5");
        };
        like.lambda();
    }
}
//1.定义一个函数式接口
interface ILike{
    void lambda();
}
//2.实现类
class Like implements ILike{
    @Override
    public void lambda() {
        System.out.println(" i like lambda");
    }
}
举例2
public class TestLambda2 {
    //静态内部类
    static class Love2 implements ILove{
        @Override
        public void love(int a) {
            System.out.println(" i love you ----》" + a);
        }
    }
    public static void main(String[] args) {
        ILove  love = new Love();
        love.love(1);
        love = new Love2();
        love.love(2);
        //局部内部类
        class Love3 implements ILove{
            @Override
            public void love(int a) {
                System.out.println(" i love you ----》" + a);
            }
        }
        love = new Love3();
        love.love(3);
        //匿名内部类
        love = new ILove() {
            @Override
            public void love(int a) {
                System.out.println(" i love you ----》" + a);
            }
        };
        love.love(4);
        love = (int a) ->{
            System.out.println(" i love you ----》" + a);
        };
        love.love(520);
        //简化1.参数类型
        love = (a) ->{
            System.out.println(" i love you ----》" + a);
        };
        love.love(521);
        //简化2.简化括号
        love = a ->{
            System.out.println(" i love you ----》" + a);
        };
        love.love(5211);
        //简化3.去掉花括号
        love = a -> System.out.println(" i love you ----》" + a);
        love.love(5212);
        /*
        总结:
            lambda表达式只能有一行代码的情况下才能简化成一行
            前提是必须是函数式接口
         */
    }
}
interface ILove{
    void love(int a);
}
class Love implements ILove{
    @Override
    public void love(int a) {
        System.out.println(" i love you ----》" + a);
    }
}
简化总结
不推荐使用JDK提供的stop(),destroy()方法【已废弃】
推荐线程自己停止下来
建议使用一个标志位进行终止变量当flag = false,则终止线程运行
举例
//测试stop
//1.建议线程正常停止---》利用次数,不建议死循环
//2.建议使用标志位---》设置一个标志位
//3.不要使用stop或者destroy等过时或者JDK不建议使用的方法
public class TestStop implements Runnable{
    //1.设置一个标识位
    private boolean flag = true ;
    @Override
    public void run() {
        int i = 0;
        while (flag){
            System.out.println("run.....thread" + i++);
        }
    }
    //2.设置一个公开的方法停止线程,转换标志位
    public void stop(){
        this.flag = false;
    }
    public static void main(String[] args) {
        TestStop testStop = new TestStop();
        new Thread(testStop).start();
        for (int i = 0; i < 1000; i++) {
            System.out.println("main" + i);
            if (i == 500){
                //调用stop方法,切换标志位,停止线程
                testStop.stop();
                System.out.println("线程停止");
            }
        }
    }
}
sleep(时间) 指定当前线程阻塞的毫秒数 【1000毫秒 = 1秒】
sleep存在异常InterrupturedException;
sleep时间达到后线程进入就绪状态
sleep可以模拟网络延时、倒计时等
每一个对象都有一个锁,sleep不会释放锁
package com.tread.demo01.state;
import java.text.SimpleDateFormat;
import java.util.Date;
public class TestSleep2 {
    public static void main(String[] args) {
       /* try {
            tenDown();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }*/
        //打印当前系统时间
        Date startTime = new Date(System.currentTimeMillis());//获取当前时间
        while(true){
            try {
                Thread.sleep(1000);
                System.out.println(new SimpleDateFormat("HH:mm:ss").format(startTime));
                startTime = new Date(System.currentTimeMillis());//更新当前时间
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }
    //模拟倒计时
    public static void tenDown() throws InterruptedException {
        int num = 10;
        while (true){
            Thread.sleep(1000);
            System.out.println(num--);
            if (num <=0 ){
                break;
            }
        }
    }
}
原文:https://www.cnblogs.com/Zoya-BB/p/14952172.html