java多线程编程技术

2 篇文章 0 订阅

start()与run()方法的区别

   start():该方法是在当前线程中启动一个新的线程,而新启动的线程会调用run()方法,同时该方法不能重复调用;

   run()  :该方法和普通的方法一样,可以重复执行,不会创建新的线程。

1.线程调用得随机性:

     创建一个自定义得线程类MyThread.java,此类继承自Thread,并且重写run方法。执行得代码如下:

/**
 * @author renhuifeng
 * @program: workThread->MyThread
 * @description: 线程的调用得随机性
 * @create: 2019-12-02 14:10
 **/
public class MyThread extends Thread{
    @Override
    public  void run(){
        super.run();
        System.out.println("Mythread");
    }
}

class Test{
    public static void main(String[] args) {
        MyThread th = new MyThread();
        th.start();
        System.out.println("运行结束!");

    }
}

总结:线程的再main方法n次不确定的调用输出结果得到了变化,证明线程调用时随机的。

 

2.演示过线程的调用的随机性后,演示线程的随机性

创建自定义线程类MyThread.java,代码如下:

package com.company;

/**
 * @author renhuifeng
 * @program: workThread->MyThread
 * @description: 线程执行的随机性
 * @create: 2019-12-02 14:10
 **/
public class MyThread extends Thread{
    @Override
    public  void run(){
        for(int i =0;i<10;i++){
            int time = (int) (Math.random()*1000);
            try {
                Thread.sleep(time);
                System.out.println("run=" +Thread.currentThread().getName());
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }
}

class Test{
    public static void main(String[] args) {
        MyThread th = new MyThread();
        th.setName("myThread");
        th.start();
        for(int i =0;i<10;i++){
            int time = (int) (Math.random()*1000);
            try {
                Thread.sleep(time);
                System.out.println("main=" +Thread.currentThread().getName());
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }

    }
}

在代码中,为了展现出线程具有随机特性,所以使用随机数的形式来使线程挂起的效果,从而表现出cpu执行哪个线程具有不确定性。

       Thread.java 类中的start()方法通知“线程规划器”此线程已经准备就绪,等待调用线程对象的run()方法。这个过程其实就是让系统安排一个时间来调用Thread中run()方法,也就是使xain'cehng得到运行,启动线程,具有异步执行的效果。如果调用代码thread.run()就不是异步执行了,而是同步,那么此线程对象并不交给“线程规划器”来进行处理,而是由main主线程来调用run()方法,也就是必须等run()方法中代码执行完后才可以执行后面的代码。

另外注意是,执行start()方法的顺序不代表线程启动的顺序,创建测试代码如下:

public class MyThread extends Thread{
    private int i;

    public MyThread(int i) {
        this.i = i;
    }

    @Override
    public  void run(){
        System.out.println(i);
    }
}

class Test{
    public static void main(String[] args) {
        MyThread th1 = new MyThread(1);
        MyThread th2 = new MyThread(2);
        MyThread th3 = new MyThread(3);
        MyThread th4 = new MyThread(4);
        MyThread th5 = new MyThread(5);
        MyThread th6 = new MyThread(6);
        MyThread th7 = new MyThread(7);
        MyThread th8 = new MyThread(8);
        MyThread th9 = new MyThread(9);
        MyThread th10 = new MyThread(10);
        th1.start();
        th2.start();
        th3.start();
        th4.start();
        th5.start();
        th6.start();
        th7.start();
        th8.start();
        th9.start();
        th10.start();



    }
}

执行结果:

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

任错错

如果对您有帮助我很开心

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值