Thread创建多线程笔记

Thread创建多线程步骤:

  • 多线程的创建:方式一:继承Thread类
  • 1.创建一个继承于Thread类的子类
  • 2.重写Thread类的run方法 -->将此线程执行的操作声明在run方法里面
  • 3.创建Thread类的子类对象
  • 4.通过此对象调用start()方法
/*
* 多线程的创建:方式一:继承Thread类
* 1.创建一个继承于Thread类的子类
* 2.重写Thread类的run方法 -->将此线程执行的操作声明在run方法里面
* 3.创建Thread类的子类对象
* 4.通过此对象调用start()方法
* */
//1.创建一个继承于Thread类的子类
class MyThreadTest extends Thread {
    //2.重写Thread类的run方法 -->将此线程执行的操作声明在run方法里面
    @Override
    public void run() {
        //遍历一百以内的所有偶数
        for (int i = 0; i < 100; i++) {
            if (i % 2 == 0) {
                System.out.println(i);
            }
        }
    }
}
public class MyThread {
    public static void main(String[] args) {
       // 3.创建Thread类的子类对象
        MyThreadTest myThreadTest = new MyThreadTest();
        //4.通过此对象调用start()方法,启动子线程
        myThreadTest.start();


    }
}


主线程继续,cpu随机切换执行父线程与子线程

package com.com.sun.test;

/**
 * @author sun
 * @date 2021/6/22 - 9:00
 */
/*
* 多线程的创建:方式一:继承Thread类
* 1.创建一个继承于Thread类的子类
* 2.重写Thread类的run方法 -->将此线程执行的操作声明在run方法里面
* 3.创建Thread类的子类对象
* 4.通过此对象调用start()方法
* */
//1.创建一个继承于Thread类的子类
class MyThreadTest1 extends Thread {
    //2.重写Thread类的run方法 -->将此线程执行的操作声明在run方法里面
    @Override
    public void run() {
        //遍历一百以内的所有偶数
        for (int i = 0; i < 100; i++) {
            if (i % 2 == 0) {
                System.out.println(i);
            }
        }
    }
}

public class MyThread1 {
    public static void main(String[] args) {
       // 3.创建Thread类的子类对象
        MyThreadTest myThreadTest = new MyThreadTest();
        //4.通过此对象调用start()方法,启动当前线程,调用当前线程的run方法
        myThreadTest.start();

        //问题1:调用子线程只能通过start()方法,启动子线程,不可以直接调用run方法
        //myThreadTest.run();错误

        //问题二:不能多次调用start()方法,一个对象只能调用一次start()方法
        //myThreadTest.start();
        //myThreadTest.start();错误
        //正确做法:
        // 需要多次调用子线程,需要多次创建对象
       /* MyThreadTest myThreadTest1 = new MyThreadTest();
        MyThreadTest myThreadTest2 = new MyThreadTest();
        myThreadTest1.start();
        myThreadTest2.start();*/



        //主线程继续,cpu随机切换执行父线程与子线程
        for (int i=0;i<100;i++){
            if(i%2==0){
                System.out.println("main+++++++++++++"+i);
            }
        }
    }
}


认识多线程中常用方法

在这里插入图片描述

  • (1)void start():启动线程,并执行对象的run方法
  • (2)run():线程在被调度时执行的操作
  • (3)String getName():返回线程名称
  • (4)viod setName(String name):设置该线程名称
  • (5)static Thread currentThread():返回当前线程
  • (6)static viod yield():线程让步
  • 暂停当前线程,把执行机会让给优先级相同或者更高的线程
  • 若没有优先级更高或者相同的线程,则忽略该方法
  • (7)join()方法调用的线程将被阻塞,直到join()方法加入的线程完成为止
  • (8)static viod sleep(long millis)指定时间毫秒
  • 令当前活动线程在指定时间内放弃cpu控制,使得其他线程有机会被执行,时间到后重新排队
  • (9)boolean isAlive(),返回boolean,判断线程是否还活着
  • (10)setPriority()设置线程优先级
package com.com.sun.test;

/**
 * @author sun
 * @date 2021/6/22 - 9:00
 */
/*
* 多线程的创建:方式一:继承Thread类
* 1.创建一个继承于Thread类的子类
* 2.重写Thread类的run方法 -->将此线程执行的操作声明在run方法里面
* 3.创建Thread类的子类对象
* 4.通过此对象调用start()方法
*
* 5.认识多线程中常用方法
* (1)void start():启动线程,并执行对象的run方法
* (2)run():线程在被调度时执行的操作
* (3)String getName():返回线程名称
* (4)viod setName(String name):设置该线程名称
* (5)static Thread currentThread():返回当前线程
* (6)static viod yield():线程让步
* 暂停当前线程,把执行机会让给优先级相同或者更高的线程
* 若没有优先级更高或者相同的线程,则忽略该方法
* (7)join()方法调用的线程将被阻塞,直到join()方法加入的线程完成为止
* (8)static viod sleep(long millis)指定时间毫秒
* 令当前活动线程在指定时间内放弃cpu控制,使得其他线程有机会被执行,时间到后重新排队
* (9)boolean isAlive(),返回boolean,判断线程是否还活着
* (10)setPriority()设置线程优先级
* */
//1.创建一个继承于Thread类的子类
class MyThreadTest2 extends Thread {
    //2.重写Thread类的run方法 -->将此线程执行的操作声明在run方法里面
    @Override
    public void run() {
        //遍历一百以内的所有偶数
        for (int i = 0; i < 100; i++) {
            if (i % 2 == 0) {
                try {
                    //static viod sleep(long millis)指定时间毫秒
                    //令当前活动线程在指定时间内放弃cpu控制,使得其他线程有机会被执行,时间到后重新排队
                    sleep(1000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                //Thread.currentThread().getName()获取当前线程的名称
                System.out.println(Thread.currentThread().getName()+":"+i);
            }
            //static viod yield():线程让步
            if(i%20==0){
                yield();
            }
        }
    }
}

public class MyThread2 {
    public static void main(String[] args) {
       // 3.创建Thread类的子类对象
        MyThreadTest2 myThreadTest = new MyThreadTest2();
        //设置
        myThreadTest.setPriority(Thread.MAX_PRIORITY);
        //4.通过此对象调用start()方法,启动子线程
        myThreadTest.start();

        for (int i=0;i<100;i++){
            if(i%2==0){
                //Thread.currentThread().getName()获取当前线程的名称
                System.out.println(Thread.currentThread().getName()+":"+i);
            }

        }


    }
}


多线程卖片例子:

package com.com.sun.test;

/**
 * @author sun
 * 创建三个买票窗口,总票数为100张
 * 存在线程安全问题
 * @date 2021/6/26 - 9:06
 */
public class WindowsTest{
    public static void main(String[] args) {
        Window w1=new Window();
        Window w2=new Window();
        Window w3=new Window();

        w1.setName("窗口1");
        w2.setName("窗口2");
        w3.setName("窗口3");

        w1.start();
        w2.start();
        w3.start();
    }





}

class Window extends Thread{
    //票数,设置为静态,让多个窗口共用,不然会出现三百张票
    private static int ticket=100;
    @Override
    public void run() {

        while(true){
            if(ticket>0){
                System.out.println(getName()+"卖票:票号为:"+ticket);
                ticket--;
            }else{
                break;
            }
        }
    }
}
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值