java基础--多线程---简要和两种实现方式

线程简要理解

进程:可执行文件或者程序,例如.exe
线程:进程的执行单元或者路径。
(车看做进程,线程就是马路,单线程就是单行道,多线程就是多行道)
多线程软件:QQ,微信,就是你和别人聊天的同时,还能和另一个人聊天,能够同时进行多个事情。
一个电脑上可以有多个进程,这些进程之间的数据时隔离的。(我用qq发给你的信息,你只能用qq接收,而不能用微信接受)
一个进程可以有多个线程,这些线程之间共享当前进程的数据

常见面试题

多线程并行和并发的区别:
多线程并行:多个进程同时执行,前提是:需要多核CPU
多线程并发:多个线程同时请求执行,但CPU同时只能执行一个,于是就安排这些线程交替执行,由于时间非常短,所以我们看起来就像是同时执行的,其实并不是。

多线程的实现两种方式一

区别:
方式一:继承Thread类。好处:代码相对比较简单,因为是直接继承Thread类,所以可以直接使用Thread类中的方法。弊端:扩展性较差,因为是继承了Thread类,就不能继承别的类了。
方式二:实现Runnable接口。好处:扩展性较强。弊端:代码相对比较繁琐。

方式一:

package thread;

public class TestThread {
    /*
     * 多线程的实现方式一:
     *     1、定义一个类(MyThread)去继承Thread
     *     2、重写Thread#run()方法,并把要执行的代码写入到run中
     *     3、创建线程对象
     *     4、开启线程
     * 注意:
     *     a、开启线程用的是start()方法
     *     b、同一线程不能重复开启,虽然编译会通过,但是会报“线程状态非法异常”
     *     IllegalThreadStateException
     * 多线程执行具有:随机性,延迟性。原因是CPU做着高效的切换
     *     即每次执行效果是不一样的
     */
    public static void main(String[] args){
        MyThread mt = new MyThread();
        //开启线程调用的是start()方法,并且不能重复开启,而且也不是调用run()方法
        //mt.run();这样写也不会报错,但不是多线程程序。
        mt.start();
        for(int i=0;i<200;i++){
            System.out.println("我是正在进行main~~~~~"+i);
        }
    }
}
package thread;

public class MyThread extends Thread {
    @Override
    public void run() {
        for(int i=0;i<300;i++){
            System.out.println("我是正在进行的另一个线程~~~~~"+i);
        }
    }
}

方式二:
实现原理解析

MyRunnable mr = new MyRunnable();
        Thread th = new Thread(mr);
        th.start();//th.start(),此时调用的不是Thread的run方法,而是重写Runnable的run()方法
        /*
         * 原因就是实现Runnable接口的原理
         * 简化实现原理代码如下
         */
        public class Thread{
            private Runnable target;

            public Thread(Runnable target) {
                this.target = target;
            }
            public void run(){
                if(target!=null){
                    target.run();//多态原理,调用的是非静态的方法,遵循编译看左运行看右
                }
            }

        }

正式实现代码如下:

package thread;

public class TestThread2 {
    /*
     * 多线程的实现方式二:
     *     1、定义一个类(MyRunnable)去实现Runnable
     *     2、重写Runnable#run()方法,并把要执行的代码写入到run中
     *     3、创建Runnable接口的子类对象,将其作为参数传入到Thread类的构造中,创建线程对象
     *     4、开启线程
     * 注意:
     *     a、开启线程用的是start()方法
     *     b、同一线程不能重复开启,虽然编译会通过,但是会报“线程状态非法异常”
     *     IllegalThreadStateException
     * 多线程执行具有:随机性,延迟性。
     *     即每次执行效果是不一样的
     */
    public static void main(String[] args) {
        //创建Runnable接口的子类对象,
        MyRunnable mr = new MyRunnable();
        //将其作为参数传入到Thread类的构造中,创建线程对象
        //方式一种是Mythread创建对象,其调用的是Thread的无参构造,这里使用的是有参构造
        Thread th = new Thread(mr);
        th.start();
        for(int i=0;i<200;i++){
            System.out.println("我是正在进行main~~~~~"+i);
        }
    }

}
package thread;

public class MyRunnable implements Runnable {
    @Override
    public void run() {
        for(int i=0;i<300;i++){
            System.out.println("我是正在Runnable~~~~~"+i);
        }

    }
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值