Java学习笔记:线程

 

  • 创建线程的3种方式

(1)继承Thread类创建线程类

//创建线程
public class MyThread1 extends Thread { //定义Thread的继承类
    @Override
    public void run() { //重写run()方法
        //线程执行体
    }
}

//执行线程
public static void main(string[] args) {
    new MyThread1().start(); //创建并启动第1个线程
    new MyThread1().start(); //创建并启动第2个线程
}

(2)实现Runnable接口创建线程类

//创建线程
public class MyThread2 implements Runnable { //定义Runnable接口的实现类
    @Override
    public void run() { //重写run()方法
        //线程执行体
    }
}

//执行线程
public static void main(string[] args) {
    var mt = new MyThread2(); //创建Runnable接口实现类的对象
    new Thread(mt, "新线程1").start(); //创建并执行第1个线程(命名为“新线程1”)
    new Thread(mt, "新线程2").start(); //创建并执行第2个线程(命名为“新线程2”)
}

(3)实现Callable接口创建线程类

//创建线程
public class MyThread3 implements Callable<int> {
    @Override
    public int call() throws Exception {
        //线程执行体
        return 0;
    }
}

//调用线程
public static void main(String[] args) {
    //创建线程池(通过实现Callable接口来实现线程类,通常配合线程池使用)
    ExecutorService executorService = Executors.newCachedThreadPool();
    //将Callable实例的对象放进线程池,并返回一个Future对象
    Future<Int> future = executorService.submit(new MyThread3());
    //调用Future对象的get()方法可获取返回值(调用后线程处于阻塞状态,直到call()方法执行完成)
    System.out.println(future.get());
}
  • 3种创建方式的比较

 继承Thread类实现Runnable接口实现Callable接口
返回值
异常抛出不可不可
复杂度简洁较复杂复杂
继承不可继承其他类可继承其他类,适用于多个线程处理同一个资源
访问可用this访问当前线程需用Thread.currentThread()访问当前线程

 

  • 线程的6种状态

Thread.state反映了线程的6种状态:

(1)NEW - 新建状态(尚未执行)
(2)RUNNABLE - 运行状态(执行或就绪,由JVM线程调度器安排)
(3)BLOCKED - 阻塞状态
(4)WAITING - 等待状态(无限等待)
(5)TIMED_WAITING - 限时等待状态
(6)TERMINATED - 终止状态(执行完或被终止)

说明:
(1)调用线程对象的isAlive()方法,可获取线程的状态。运行、阻塞、等待状态返回true,新建和终止状态返回false。
(2)线程应该调用start()方法执行,不可直接调用run()方法或call方法执行,否则只能执行单线程。
(3)线程只有在新建状态时,才可调用start()方法执行,其他状态下都不可再次调用start()方法。

 

  • 线程的3种同步机制

(1)同步代码块

public class MyThread4 extends Thread {
    //定义同步锁
    private Object obj;

    @Override
    public void run() {
        //使用同步锁
        synchronized (obj) {
            //线程执行体(同步代码块)
        }
    }
}

(2)同步方法

public class MyClass1 {
    //定义一个线程安全的方法(用到synchronized修饰符)
    public synchronized void myWork() {

    }
}

public class MyThread6 extends Thread {
    private MyClass1 mc;
    @Override
    public void run() {
        //使用同步锁
        mc.myWork();
    }
}

(3)同步锁(是对同步方法的显式使用)

public class MyClass2 {
    //定义锁对象
    private final ReentrantLock lock = new ReentrantLock();
    //定义一个线程安全的方法
    public void myWork() {
        lock.lock(); //加锁
        try {
            //线程执行体
        } finally {
            lock.unlock(); //释放锁
        }
    }
}

public class MyThread7 extends Thread {
    private MyClass2 mc;
    @Override
    public void run() {
        //使用同步锁
        mc.myWork();
    }
}

 

  • 几个常用的线程类方法

方法名返回值参数说明
getName()String获取线程名称
getPriority()int获取线程优先级
getState()Thread.status获取线程状态
setName()voidString:名称设置线程名称
setPriority()voidint:优先级设置线程优先级
interrupt()void中断此线程
join()void等待该线程死亡
sleep()voidint:毫秒使当前正在执行的线程休眠

 

 

 

 

 

 

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值