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

目录

一、前言

二、线程和过程

三、多线程的创立

多线程创立的两种形式:

形式①:

形式②:

四、几个常见的问题?

为什么要重写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高并发编程详解-多线程与架构设计》,点此可收费支付电子版书籍

评论

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

这个站点使用 Akismet 来减少垃圾评论。了解你的评论数据如何被处理