继承Thread 和runnable

自定义线程类继承Thread类

重写run()方法,编写线程执行体
创建对象,调用start()方法自动线程

1.start()

启动当前线程, 调用当前线程的run()方法

2.run()

通常需要重写Thread类中的此方法, 将创建的线程要执行的操作声明在此方法中

3.yield()

释放当前CPU的执行权

4.join()

在线程a中调用线程b的join(), 此时线程a进入阻塞状态, 知道线程b完全执行完以后, 线程a才结束阻塞状态

5.sleep(long militime)

让线程睡眠指定的毫秒数,在指定时间内,线程是阻塞状态

6.wait()

一旦执行此方法,当前线程就会进入阻塞,一旦执行wait()会释放同步监视器。

7.sleep()和wait()的异同

相同点:两个方法一旦执行,都可以让线程进入阻塞状态。

不同点:

1) 两个方法声明的位置不同:Thread类中声明sleep(),Object类中声明wait()

2) 调用要求不同:sleep()可以在任何需要的场景下调用。wait()必须在同步代码块中调用。

2) 关于是否释放同步监视器:如果两个方法都使用在同步代码块呵呵同步方法中,sleep不会释放锁,wait会释放锁。

8.notify()

一旦执行此方法,将会唤醒被wait的一个线程。如果有多个线程被wait,就唤醒优先度最高的。

9.notifyAll()

一旦执行此方法,就会唤醒所有被wait的线程 。

10.LockSupport

LockSupport.park()和LockSupport.unpark()实现线程的阻塞和唤醒的。

run 和 start方法的不同:

调用start 方法 他就是交替同时运行的

调用run() 方法的结果:他会先执行run()方法对应的输出结果,之后才输出main主线程对应的输出结果

​
/**
* 多线程创建:继承Thread
*
* @author mikechen
*/
class MyThread extends Thread {

    private int i = 0;


    @Override
    public void run() {
        for (i = 0; i < 10; i++) {
            System.out.println(Thread.currentThread().getName() + " " + i);
        }
    }


    public static void main(String[] args) {
        MyThread myThread=new MyThread();
        myThread.start();
    }


}

​

Runnable:

1、适合多个相同程序的线程去处理统一资源的情况,把相同线程代码和数据有效分离,体现了面向对象的思想。

2、可以避免java单继承带来的局限性。

//创建线程方式2: 实现runnable接口,重写run()方法,执行线程需要丢入runnable接口实现类,调用start方法
public class Thread implements Runnable{
    @Override
    public void run() {
        //run方法线程体
        for (int i = 0; i < 10; i++) {
            System.out.println("ppp");
        }
    }
    public static void main(String[] args) {
        //创建runnable接口的实现类对象
        Thread thread = new Thread();
        //创建线程对象,通过线程对象来开启我们的线程,代理
        /*Thread thread = new Thread(thread);
        thread.start();*/
        new Thread(thread).start();
        for (int i = 0; i < 200; i++) {
            System.out.println("hhh");
        }
    }
}
  • 定义 MyRunnable类 实现 Runnable接口
  • 重写run()方法,编写线性执行体
  • 创建线程对象,调用 start() 方法启动线程

关于runnable和thread类的区别:

继承Thread的线程对象之间不能共享数据

    实现Runable线程对象,如果使用不同的Thread对象启动同一个Runable线程对象,则会共享内存数据,
    这种现象,可能会出现线程安全问题。

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值