2021-10-22(java-多线程)

目录

继承Thread类:

实现runnable接口:

初实并发问题:

(龟兔赛跑):

实现Callable:(了解即可)

静态代理:

Lamda表达式:

lambda推导过程:

lambda有参构造:

线程状态:(五个状态)



继承Thread类:

public class Tt extends Thread{         //继承thread类
    @Override                                      //重写run方法
    public void run() {
        for (int i = 0; i < 20; i++) {
            System.out.println("1:"+i);
        }
    }

    public static void main(String[] args) {
        Tt tt= new Tt();                        //创建一个新对象
        tt.start();                            //start方法开启线程


        for (int i = 0; i < 20; i++) {
            System.out.println("2:"+i);
        }
    }
}

实现runnable接口:

public class Tt implements Runnable{
    @Override
    public void run() {
        for (int i = 0; i < 20; i++) {
            System.out.println("1:"+i);
        }
    }

    public static void main(String[] args) {
          Tt tt = new Tt();

//        Thread thread = new Thread(tt);    
//        thread.start();
        new Thread(tt).start();

        for (int i = 0; i < 20; i++) {
            System.out.println("2:"+i);
        }
    }
}

初实并发问题:

        当多线程操作一个资源的情况下,线程不安全,数据紊乱。

(龟兔赛跑):

package 练习;

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(1);
                } 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);
                return true;
            }
        }
        return false;
    }

    public static void main(String[] args) {
        Race race = new Race();
        new Thread(race,"兔子").start();
        new Thread(race,"乌龟").start();

    }
}

实现Callable:(了解即可)

        实现接口,需要返回值。

        重写call方法。

        创建执行服务。

        提交执行。

        获取结果

        关闭服务

        

     

public static void main(String[] args) throws ExecutionException, InterruptedException {
    Th th1 = new Th();
    
    ExecutorService ser= Executors.newFixedThreadPool(1);   //创建执行服务
    Future<Object> r1=ser.submit(th1);      //提交执行
    Object rs1=r1.get();        //获取结果
    ser.shutdownNow();          //关闭服务
}

静态代理:

        真实对象和对立对象都要实现同一个接口。

        代理对象要代理真实对象。

package 练习;

public class jingtai {
    public static void main(String[] args) {
        You you = new You();
        Wedding wedding = new Wedding(you);
        wedding.Happy();
    }
}
interface Marry{    //功能接口
    void Happy();
}
class You implements Marry{
    @Override
    public void Happy() {
        System.out.println("我要结婚了");
    }
}
class Wedding implements Marry{
    private Marry target;
    public Wedding(Marry target){
        this.target=target;
    }

    @Override
    public void Happy() {
        before();
        this.target.Happy();
        after();
    }

    private void after() {
        System.out.println("之后");
    }

    private void before() {
        System.out.println("之前");
    }
}

Lamda表达式:

函数式接口的定义:

        任何接口,如果只包含唯一一个抽象方法,那么他就是一个函数式接口

        

public interface Runnable{\

        public abstract void run();
}

        对于函数式接口,我们可以通过lambda表达式创建该接口的对象。

lambda推导过程:

package 练习2;

public class TestLambda {
    //    3.静态内部类
    static class Like2 implements TLike {
        @Override
        public void lambda() {
            System.out.println("lambda2");
        }
    }

    public static void main(String[] args) {

//4.局部内部类
        class Like3 implements TLike {
            @Override
            public void lambda() {
                System.out.println("lambda3");
            }
        }
        TLike like = new Like();
        like.lambda();

        like = new Like2();
        like.lambda();

        like = new Like3();
        like.lambda();
        //        5.匿名内部类   没有类的接口 必须借助接口或者父类
        like = new TLike() {
            @Override
            public void lambda() {
                System.out.println("lambda4");
            }
        };
        like.lambda();
//        6.用lambda
        like = () -> {
            System.out.println("lambda5");
        };
        like.lambda();
    }

    //1.定义一个函数式接口
    interface TLike {
        void lambda();
    }

    //2.实现类
    static class Like implements TLike {
        @Override
        public void lambda() {
            System.out.println("lambda");
        }
    }
}

lambda有参构造:

        局部内部类:new接口然后重写方法;

        lambda:类 对象名=(参数)->{方法}

              简化:类 对象名=参数->{方法}

              简化:类 对象名=参数->方法             //前提代码单行可以。

线程状态:(五个状态)

         new为新生状态,调用start为就绪状态(但不意味着立即执行),阻塞状态(sleep,wait或者同步锁),运行状态,死亡状态在这里插入图片描述

 线程停止
  1.建议线程正常停止----》利用次数。不建议死循环
  2.建议使用标志位----》设置一个标志位
  3.不用使用stop或destory 等过时或者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 == 900) {
                //调用stop方法切换标志位,让线程停止
                testStop.stop();
                System.out.println("该线程停止了");
            }
        }

    }
}


おすすめ

転載: blog.csdn.net/qq_45688193/article/details/120903411