关于java:Java室友打一把王者就学会了多线程

5次阅读

共计 2751 个字符,预计需要花费 7 分钟才能阅读完成。

目录

一、前言

二、线程和过程

三、多线程的创立

多线程创立的两种形式:

形式①:

形式②:

四、几个常见的问题?

为什么要重写 run 办法?

run()办法和 start 办法的区别?

通过继承的办法和实现接口的形式创立多线程,哪个好?

五、线程管制

sleep:

join

setDaemon():

六、线程的生命周期
一、前言

线程可能听起来有点难,其实也是十分好了解的,咱们以游戏姿态进入。
二、线程和过程

过程:是正在运行的,过程是资源分配的最小单位。

线程:是 cpu 调度的最小单位(线程依赖于过程)。

下面可能有些难懂,打个比喻,好比你打一把王者(其实我不玩哈 doge),过程比作是你

开的那一把游戏,线程比作成每个玩家所选的英雄或者是游戏中的水晶野怪等之类的。带着

这个比喻来了解过程和线程的一些关系。

一个过程有多个线程就叫多线程。是不是感觉十分好了解。

1. 线程在过程下进行

1.(比方你独自的英雄角色、野怪、小兵必定不能运行)

2. 过程之间不会相互影响,一个线程完结将会导致整个过程完结

2.(两把游戏之间不会有分割和影响。你的水晶被推掉,你这把游戏就完结了)

3. 不同的过程数据很难共享

3.(两把游戏之间很难有分割,有分割的状况比方上把的敌人这把又匹配到了)

4. 同过程下的不同线程之间数据很容易共享

4.(你开的那一把游戏,你能够看到每个玩家的状态(生死),也能够看到每个玩家的出配备等等)

5. 过程的应用内存地址能够限定使用量

5.(开的房间模式,你能够设置有多少人进,当房间满了后,其他人就进不去了,除非有人退出房间,其他人能力进)

举荐浏览:《Java 高并发编程详解 - 多线程与架构设计》,点此可收费支付电子版书籍

三、多线程的创立

多线程创立的两种形式:

♠①:创立一个类继承 Thread 类,并重写 run 办法。

♠②:创立一个类实现 Runnable 接口,并重写 run 办法。

形式①:

MyThread 类下:

public class MyThread extends Thread {
    @Override
    public void run() {for(int i=0;i<100;i++){System.out.println(getName()+": 打了"+i+"个小兵");
        }
    }
}

MyThreadText 类下:

public class MyThreadText {public static void main(String[] args) {
        // 创立 MyThread 对象
        MyThread t1=new  MyThread();
        MyThread t2=new  MyThread();
        MyThread t3=new  MyThread();
        // 设置线程的名字
        t1.setName("鲁班");
        t2.setName("刘备");
        t3.setName("亚瑟");
        // 启动线程
        t1.start();
        t2.start();
        t3.start();}
}

效果图:

形式②:

MyRunnable 类下:

public class MyRunnable implements Runnable {
    @Override
    public void run() {for(int i=0;i<10;i++){
            try {//sleep 会产生异样要显示解决
                Thread.sleep(20);// 暂停 20 毫秒
            } catch (InterruptedException e) {e.printStackTrace();
            }
            System.out.println(Thread.currentThread().getName()+"打了:"+i+"个小兵");
        }
    }
}

MyRunnableText 类下:

public class MyRunnableText {public static void main(String[] args) {
    // 创立 MyRunnable 类
    MyRunnable mr=new MyRunnable();
    // 创立 Thread 类的有参结构, 并设置线程名
    Thread t1=new Thread(mr,"张飞");
    Thread t2=new Thread(mr,"貂蝉");
    Thread t3=new Thread(mr,"吕布");
    // 启动线程
    t1.start();
    t2.start();
    t3.start();}
 
}

有 sleep 暂停的效果图:

举荐浏览:《Java 高并发编程详解 - 多线程与架构设计》,点此可收费支付电子版书籍

四、几个常见的问题?
为什么要重写 run 办法?

因为 run 办法是用来封装被线程执行的代码。

un()办法和 start 办法的区别?

​ run(): 封装线程执行的代码,间接调用相当于调用一般办法。就是始终到这个办法完结才进去。
​ start(): 启动线程,而后由 JVM 此线程的 run()办法,可同时进行多个对象调用 start()办法。

通过继承的办法和实现接口的形式创立多线程,哪个好?

实现 Runable 接口好,起因:

①防止了 Java 单继承的局限性

②适宜多个雷同的程序代码去解决同一资源的状况,把线程、代码和数据无效的拆散,

体现进去面向对象的设计思维。

五、线程管制

sleep:

sleep 的应用要进行显示解决异样:

 try {//sleep 会产生异样要显示解决
                Thread.sleep(20);// 暂停 20 毫秒
            } catch (InterruptedException e) {e.printStackTrace();
            }

join:

♠ join 是指期待这个线程执行完才会轮到后续线程失去 cpu 的执行权,应用这个也要抛出异样

具体应用:

public class MyThreadText {public static void main(String[] args) throws InterruptedException {//throws 抛出 join 呈现的异样
        // 创立 MyThread 对象
        MyThread t1=new  MyThread();
        MyThread t2=new  MyThread();
        MyThread t3=new  MyThread();
        // 设置线程的名字
        t1.setName("鲁班");
        t2.setName("刘备");
        t3.setName("亚瑟");
        // 启动线程
        t1.start();
        t1.join();// 期待 t1 执行完才会轮到 t2,t3 抢
        t2.start();
        t3.start();}
}

setDaemon():

        t1.setName("张飞");
        t2.setName("关羽");
        t3.setName("刘备");
        t1.setDaemon(true);
        t2.setDaemon(true);

为 true 时阐明是守护线程。

将 t1,t2 设置守护线程 t3 就是主线程了,则当所有的主线程完结后,守护线程也会跟着

完结,但不是立即完结。

六、线程的生命周期

举荐浏览:《Java 高并发编程详解 - 多线程与架构设计》,点此可收费支付电子版书籍

正文完
 0