Java的多线程编程

Java的多线程编程

多线程的定义

  1. 进程:可以理解成一个运行中的应用程序,是系统进行资源分配和调度的基本单位,是操作系统结构的基础,主要管理资源。
    线程:是进程的基本执行单元,一个进程对应多个线程。
  2. 主线程:处理UI,所有更新UI的操作都必须在主线程上执行。不要把耗时操作放在主线程,会卡界面。
  3. 多线程:在同一时刻,一个CPU只能处理1条线程,但CPU可以在多条线程之间快速的切换,只要切换的足够快,就造成了多线程一同执行的假象。

多线程的应用场景

  1. 程序中出现需要等待的操作,比如网络操作、文件IO等,可以利用多线程充分使用处理器资源,而不会阻塞程序中其他任务的执行
  2. 程序中出现可分解的大任务,比如耗时较长的计算任务,可以利用多线程来共同完成任务,缩短运算时间
  3. 程序中出现需要后台运行的任务,比如一些监测任务、定时任务,可以利用多线程来完成

自定义线程

  • 继承Thread类
package com.thread;
//通过继承Thread类实现自定义线程类
public class MyThread extends Thread {
 //线程体
    @Override
    public void run() {
        System.out.println("Hello, I am the defined thread created by extends Thread");
    }
    public static void main(String[] args){
        //实例化自定义线程类实例
        Thread thread = new MyThread();
        //调用start()实例方法启动线程
        thread.start();
    }
}

优点:实现简单,只需实例化继承类的实例,即可使用线程
缺点:扩展性不足,Java是单继承的语言,如果一个类已经继承了其他类,就无法通过这种方式实现自定义线程

  • 实现Runnable接口
package com.thread;
public class MyRunnable implements Runnable {
    //线程体
    @Override
    public void run() {
        System.out.println("Hello, I am the defined thread created by implements Runnable");
    }
    public static void main(String[] args){
     //线程的执行目标对象
        MyRunnable myRunnable = new MyRunnable();
        //实际的线程对象
        Thread thread = new Thread(myRunnable);
        //启动线程
        thread.start();
    }
}

优点:

  • 扩展性好,可以在此基础上继承其他类,实现其他必需的功能
  • 对于多线程共享资源的场景,具有天然的支持,适用于多线程处理一份资源的场景

缺点:构造线程实例的过程相对繁琐一点

  • 实现Callable接口
package com.thread;
import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.FutureTask;

public class MyCallable implements Callable<String> {
    @Override
        public String call() throws Exception {
        return "Hello, I am the defined thread created by implements Callable";
    }
     public static void main(String[] args){
     	//线程执行目标
     	MyCallable myCallable = new MyCallable();
     	//包装线程执行目标,因为Thread的构造函数只能接受Runnable接口的实现类,而FutureTask类实现了Runnable接口
     	FutureTask<String> futureTask = new FutureTask<>(myCallable);
     	//传入线程执行目标,实例化线程对象
     	Thread thread = new Thread(futureTask);
     	//启动线程
     	thread.start();
     	String result = null;
     	try {
     		//获取线程执行结果
     		result = futureTask.get();
     	} catch (InterruptedException e) {
     		e.printStackTrace();
     	} catch (ExecutionException e) {
     		e.printStackTrace();
     	}
     	System.out.println(result);
     }
}

优点:

  • 扩展性好
  • 支持多线程处理同一份资源
  • 具备返回值以及可以抛出受检查异常

缺点:相较于实现Runnable接口的方式,较为繁琐

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值