多线程

创建线程的方式一: 继承Thread类

  1. 创建一个继承于Thread类的子类
  2. 重写Thread类的run()
  3. 创建Thread类的子类的对象
  4. 通过此对象调用start()
/**
 多线程的创建方式一: 继承于Thread类
 1. 创建一个继承于Thread类的子类
 2. 重写Thread类的run()
 3. 创建Thread类的子类的对象
 4. 通过此对象调用start()
 <p>
 例子: 遍历100以内所有的偶数

 @author YangJunyi */
//1. 创建一个继承于Thread类的子类
class MyThread extends Thread {
   
    //重写Thread类的run()
    @Override
    public void run() {
   
        for (int i = 0; i < 100; i++) {
   
            if(i % 2 == 0){
   
                System.out.println(Thread.currentThread().getName() + ":" + i);
            }
        }
    }
}

public class ThreadTest {
   
    public static void main(String[] args) {
   
        //创建Thread类的子类的对象
        MyThread mt = new MyThread();
        //通过此对象调用start()
        mt.start();
        mt.start();
        for (int i = 0; i < 10000; i++) {
   
            if(i % 2 == 0){
   
                System.out.println(Thread.currentThread().getName() + ":" + i + "***********");
            }
        }
    }
}

问题1: 我们不能通过 直接调用run() 的方式启动线程

问题2: 在mt.start();下面继续跟着一个mt.start(),遍历100以内的偶数,会报错IllegalThreadStateException 当首次调用start()方法时,mt线程的状态不是0 再一次mt.start()时,发现当前线程状态已经不是0了就会报出异常
不可以通过再次调用start()方法来再次开启一个线程
如果想再启动一个线程,再new一个新的MyThread对象mt2来调用mt2的start()方法

继承Thread类的匿名内部类写法

public static void main(String[] args) {
   
        //创建Thread类的匿名子类
        new Thread(){
   
            @Override
            public void run() {
   
                for (int i = 0; i < 100; i++) {
   
                    if(i % 2 == 0){
   
                        //偶数
                        System.out.println(Thread.currentThread().getName() + ":" + i);
                    }
                }
            }
        }.start();

        new Thread(){
   
            @Override
            public void run() {
   
                for (int i = 0; i < 100; i++) {
   
                    if(i % 2 != 0){
   
                        //奇数
                        System.out.println(Thread.currentThread().getName() + ":" + i);
                    }
                }
            }
        }.start();

    }

Thread类的常用方法


1. void start(): 启动线程,并执行对象的run()方法
2. run(): 通常需要重写Thread类中的此方法,线程在被调度时执行的操作写在这个方法中
3. String getName(): 返回线程的名称
4. void setName(String name):设置该线程名称
5. static Thread currentThread(): 返回当前执行的 线程。在Thread子类中就是this,通常用于主线程和Runnable实现类
6. static void yield():线程让步
暂停当前正在执行的线程,把执行机会让给优先级相同或更高的线程
若队列中没有同优先级的线程,忽略此方法
7. void join() :当某个程序执行流中调用其他线程的 join() 方法时,调用线程将
被阻塞,直到 join() 方法加入的 join 线程执行完为止
低优先级的线程也可以获得执行
8. static void sleep(long millis)(指定时间:毫秒)
令当前活动线程在指定时间段内放弃对CPU控制,使其他线程有机会被执行,时间到后
重排队。
抛出InterruptedException异常
9. stop(): 强制线程生命期结束,不推荐使用
10. boolean isAlive():返回boolean,判断线程是否还活着 

线程的调度 抢占式: 高优先级的线程抢占CPU
线程的优先级等级 Thread类中有三个常量
MAX_PRIORITY:10
MIN _PRIORITY:1
NORM_PRIORITY:5
涉及的方法
getPriority() :返回线程优先值
setPriority(int newPriority) :改变线程的优先级
高优先级的线程要抢占低优先级线程cpu的执行权,但是只是从概率上讲,高优先级的线程高概率的情况下被执行,并不意味着只有当高优先级的线程被执行完低优先级的线程才执行

创建线程的方式二 实现Runnable接口

  1. 创建一个实现类Runnable接口的类
  2. 实现Runnable的抽象方法: run()
  3. 创建实现类的对象
  4. 将此对象作为参数传递到Thread类的构造方法中,创建Thread类的对象
  5. 通过此Thread对象调用start()
/**
 多线程的创建方式二: 实现Runnable接口
 1. 创建一个实现类Runnable接口的类
 2. 实现Runnable的抽象方法: run()
 3. 创建实现类的对象
 4. 将此对象作为参数传递到Thread类的构造方法中,创建Thread类的对象
 5. 通过此Thread对象调用start()
 <p>
 例子: 遍历100以内所有的偶数

 @author YangJunyi */
// 1. 创建一个实现类Runnable接口的类
class RuThread implements Runnable {
   
    //实现Runnable接口的run()
    @Override
    public void run() {
   
        for (int i = 0; i < 100; i++) {
   
            if(i % 2 == 0){
   
                System.out.println(Thread.currentThread().getName() + ":" + i);
            }
        }
    }
}

public class ThreadTest {
   
    public static void main(String[] args) {
   
        // 3. 创建实现类的对象
        RuThread ruThread = new RuThread();
        // 4. 将此对象作为参数传递到Thread类的构造方法中,创建Thread类的对象
        Thread t1 = new Thread(ruThread);
        // 5. 通过此Thread对象调用start()
        t1.start();
    }
}

比较线程的两种方式Thread 和Runnable

开发中优先选择实现Runnable接口方式
原因:

  1. 实现的方式没有类的单继承性的局限性(只能单继承的局限性)
  2. 实现的方式更适合处理多个线程有共享数据的情况,把同一个对象传入不同的Thread类的构造器中天然就是操作同一个对象,不需要把变量上加static修饰
    联系: Thread类也实现了Runnable接口
    相同点: 都需要重写run() ,将现诚邀执行的逻辑生命在run()中

谈谈对程序 进程 线程的理解

程序: 是一段静态的代

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值