线程

导读:本篇文章讲解 线程,希望对大家有帮助,欢迎收藏,转发!站点地址:www.bmabk.com

线程

  1. 线程的理解
    要想了解线程,就需先了解进程,进程是静态的,比如如何让我们编完的代码运行起来,因为静态代码是放在代码区的。如果想要它跑起来,我们一般用到的是:
public static void main(String[] args){

    Student stu=new Student("jack",12);
    stu.setName("mary");

}
这就开辟了一个主线程,当程序执行到:stu.setName("mary");这里时,就开辟一个分支,每个分支都是一个子线程,但这没有创建新的线程,只是到student这个对象中,去执行这个方法,然后再返回到主线程中。

但是,我们想要创建新的线程,那该怎么办呢?
  1. 创建新线程
    我们一般有两种实现方式,一种是继承Thread类,重写run房后,启动该线程即可,比如:
public class MyThread  extends Thread{

    //这是线程的执行体,表示就绪状态
    @Override
    public void run() {

    }
}
但我们不建议直接继承Thread,因为java是单继承,支持多实现接口,如果我们继承了Thread,那么就没办法继承其他类,因而,我们推荐使用实现Runnable接口,重写run方法,new一个Thread对象,将实现类放在该对象中,并启动start,将线程启动,比如:
public class MyRunable implements Runnable {

    // 这是线程的执行体
    @Override
    public void run() 
        for (int i = 10; i >= 0; i--) {
            try {
                Thread.sleep(i*200) ;
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            System.out.println("当前名" + Thread.currentThread().getName() + "的线程休息了"+(i*200)+ "毫秒");
        }
    }
}
我们怎么使用该实现类?首先,我们肯定要有个主线程,也就是我们常用的main函数,在main函数中启动子线程,比如:
public static void main(String[] args) {
    multyThreadTest();
}

/**
 * 这是多线程的测试
*/
private static void multyThreadTest() {

    int i = 0;

    MyRunable myRunable = new MyRunable();
    Thread thread = new Thread(myRunable);

    //调用thread.start();开辟新的线程
    //mmyRunable和主线程(main)同时进行
    thread.start();

    for (; i <= 10; i++) {
        System.out.println("当前名" + Thread.currentThread().getName() + "的线程休息了" + (i * 200) + "毫秒");
    }
    try {
        Thread.sleep(i * 200);
    } catch (InterruptedException e) {
        e.printStackTrace();
    }
}
    该进程中一共有两个线程,一个是主线程,和一个子线程,这两个线程是并行的:

这是启动start的运行结果

假如,我们不启动start方法, 而是直接启动run方法,结果会是什么呢?
public static void main(String[] args) {
    singleThreadTest();
}

private static void singleThreadTest() {

    int i = 0;

    MyRunable myRunable = new MyRunable();
    //不开辟新的线程,直接进入子线程myRunable中,执行run方法里的逻辑
    myRunable.run();   

    /**
     * 如果注释掉下面的两句话,那么即便MyRunable实现Runable接口
     * 在执行体run()内定义了操作,但也没有办法执行,而它和普通方法
     * 差不多,也就是我们常说的,每一个分支都是一个线程,仅是单线程
     * 当该方法myRunable.run();执行完毕后,才能网下执行。
     * 当执行myRunable.run();时,线程也是主线程,即main线程
   */
    /*Thread thread = new Thread(myRunable);
    thread.start();*/

    for (; i <= 10; i++) {
        System.out.println("当前名" + Thread.currentThread().getName() + "的线程休息了" + (i * 200) + "毫秒");
    }
    try {
        Thread.sleep(i * 200);
    } catch (InterruptedException e) {
        e.printStackTrace();
    }
}

如果注释掉下面的两句话,那么即便MyRunable实现Runable接口, 在执行体run()内定义了操作,但也没有办法执行,而它和普通方法 差不多,也就是我们常说的,每一个分支都是一个线程,仅是单线程。当该方法myRunable.run();执行完毕后,才能网下执行。 当执行myRunable.run();时,线程也是主线程,即main线程。
这是启动run方法的截图

到这里,线程的理解还没结束。。。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/99303.html

(0)
小半的头像小半

相关推荐

极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!