多线程相关

程序、进程、线程

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

package com.www.java01;

/**
 * 多线程的创建,方式一:继承于Thread类
 * 1.创建一个继承于Thread类的子类
 * 2.重写Thread类的run()方法----将要执行的操作声明在run方法中
 * 3.创建子类对象
 * 4.调用start()方法
 * 例子:遍历10000以内的偶数
 * @author www
 * @creat 2022-{MONTH}-{DAY}
 */
public class ThreadTest{
    public static void main(String[] args) {
        SubThread st = new SubThread();
        //start:①启动当前线程②调用此线程的run()
        //不能写st.run(),不报错,但这个不是多线程
        //如果希望再启动一个线程,需要再创建一个新的对象
        st.start();
        //下列操作仍在主线程
        for(int i = 0;i < 100;i++){
            if(i % 2 ==0){
                System.out.println(i + "*******main()*******");
            }
        }
    }
}
class SubThread extends Thread{
    @Override
    public void run() {

        for(int i = 0;i < 10000;i++){
            if(i % 2 ==0){
                System.out.println(i);
            }
        }
    }
}


主程序中的for循环和线程子类中的run是同时进行的,部分输出结果如图
在这里插入图片描述

package com.www.java02;

/**
 * 练习:创建两个分线程,一个遍历100以内的偶数,另一个遍历100以内的奇数
 *
 *
 *
 * @author www
 * @creat 2022-{MONTH}-{DAY}
 */
public class ThreadDemo {

    public static void main(String[] args) {
        SubThread1 st1 = new SubThread1();
        SubThread2 st2 = new SubThread2();
        st1.start();
        st2.start();
    }
}
class SubThread1 extends Thread{
    @Override
    public void run() {
        for(int i = 0;i < 100;i++){
            if(i%2 == 0){
                System.out.println(Thread.currentThread().getName() + ":" + i);
            }
        }
    }
}
class SubThread2 extends Thread{
    @Override
    public void run() {
        for(int i = 0;i < 100;i++){
            if(i%2 != 0){
                System.out.println(Thread.currentThread().getName() + ":" + i);
            }
        }
    }
}

部分输出结果
在这里插入图片描述
对于只用一次的线程,还可以
在这里插入图片描述
在这里插入图片描述

package com.www.java01;

/**
 * 测试Thread中常用方法
 *1.start():启动当前线程,调用当前线程的run()
 *2.run():通常需要重写Thread类中的此方法,将创建线程的执行操作声明在此方法中
 *3.currentThread():静态方法,返回执行当前代码的线程
 *4.getName():获取当前线程名字
 *5.setName():设置当前线程名字
 *
 * @author www
 * @creat 2022-{MONTH}-{DAY}
 */
public class ThreadMethodTest {
    public static void main(String[] args) {
        SubThread3 subThread3 = new SubThread3();
        subThread3.setName("线程一");
        subThread3.start();
        //给主线程命名
        Thread.currentThread().setName("主线程");
        for (int i = 0; i < 100; i++) {
            if (i % 2 == 0) {
                System.out.println(Thread.currentThread().getName() + ":" + i);
            }
        }
    }
}
class SubThread3 extends Thread {
    @Override
    public void run() {
        for (int i = 0; i < 100; i++) {
            if (i % 2 == 0) {
                System.out.println(Thread.currentThread().getName() + ":" + i);
            }
        }
    }
}

给线程命名也可以利用构造器

package com.www.java01;

/**
 * 测试Thread中常用方法
 *1.start():启动当前线程,调用当前线程的run()
 *2.run():通常需要重写Thread类中的此方法,将创建线程的执行操作声明在此方法中
 *3.currentThread():静态方法,返回执行当前代码的线程
 *4.getName():获取当前线程名字
 *5.setName():设置当前线程名字
 *
 * @author www
 * @creat 2022-{MONTH}-{DAY}
 */
public class ThreadMethodTest {
    public static void main(String[] args) {
        SubThread3 subThread3 = new SubThread3("线程一");
        //subThread3.setName("线程一");
        subThread3.start();
        //给主线程命名
        Thread.currentThread().setName("主线程");
        for (int i = 0; i < 100; i++) {
            if (i % 2 == 0) {
                System.out.println(Thread.currentThread().getName() + ":" + i);
            }
        }
    }
}
class SubThread3 extends Thread {
    @Override
    public void run() {
        for (int i = 0; i < 100; i++) {
            if (i % 2 == 0) {
                System.out.println(Thread.currentThread().getName() + ":" + i);
            }
        }
    }
    public SubThread3(String name){
        super(name);
    }
}

输出结果
在这里插入图片描述

package com.www.java01;

/**
 * 测试Thread中常用方法
 *1.start():启动当前线程,调用当前线程的run()
 *2.run():通常需要重写Thread类中的此方法,将创建线程的执行操作声明在此方法中
 *3.currentThread():静态方法,返回执行当前代码的线程
 *4.getName():获取当前线程名字
 *5.setName():设置当前线程名字
 *6.yield():释放当前cpu执行权
 *
 * @author www
 * @creat 2022-{MONTH}-{DAY}
 */
public class ThreadMethodTest {
    public static void main(String[] args) {
        SubThread3 subThread3 = new SubThread3("线程一");
        //subThread3.setName("线程一");
        subThread3.start();
        //给主线程命名
        Thread.currentThread().setName("主线程");
        for (int i = 0; i < 100; i++) {
            if (i % 2 == 0) {
                System.out.println(Thread.currentThread().getName() + ":" + i);
            }
        }
    }
}
class SubThread3 extends Thread {
    @Override
    public void run() {
        for (int i = 0; i < 100; i++) {
            if (i % 2 == 0) {
                System.out.println(Thread.currentThread().getName() + ":" + i);
            }
            if(i % 10 ==0){
                yield();
            }
        }
    }
    public SubThread3(String name){
        super(name);
    }
}

部分输出结果:在线程一10处,释放cpu执行权,这里切换到了主线程,但并不是一定切换的,有可能线程一释放之后,线程一再次分配到执行权,释放指的是当前释放,不决定下一次的分配
在这里插入图片描述

7.join():在线程a中调用线程b的join方法,线程a就进入阻塞状态,直到线程b完全执行完之后,线程a才结束阻塞状态
public class ThreadMethodTest {
    public static void main(String[] args) {
        SubThread3 subThread3 = new SubThread3("线程一");
        //subThread3.setName("线程一");
        subThread3.start();
        //给主线程命名
        Thread.currentThread().setName("主线程");
        for (int i = 0; i < 100; i++) {
            if (i % 2 == 0) {
                System.out.println(Thread.currentThread().getName() + ":" + i);
            }
            if(i == 20){
                try {
                    subThread3.join();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }
    }
}
class SubThread3 extends Thread {
    @Override
    public void run() {
        for (int i = 0; i < 100; i++) {
            if (i % 2 == 0) {
                System.out.println(Thread.currentThread().getName() + ":" + i);
            }
//            if(i % 10 ==0){
//                yield();
//            }
        }
    }
    public SubThread3(String name){
        super(name);
    }
}

在这里插入图片描述
9.sleep(long millitime):让当前线程“睡眠”指定的毫秒数

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

新手学java2021

你的鼓励将是我创作的最大动力

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

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

打赏作者

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

抵扣说明:

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

余额充值