简单了解线程

1.进程与线程的区别

进程:操作系统进行资源分配和调度的一个独立单位。

每个进程都有自己的独立内存空间,一个进程无法直接访问其他进程的内存。

比如你打开一个应用程序,比如浏览器,那么操作系统就会创建一个新的进程来运行这个应用程序。

线程:线程是进程的一个实体,是CPU调度和分派的基本单位,

一个进程可创建多个线程,这些线程都运行在该进程的内存空间内,线程之间可共享进程的资源。

比如在浏览器中打开多个标签页,每个标签页都可以看作是一个独立的线程。

eg:

进程:当你启动QQ时,操作系统会为QQ创建一个新的进程。这个进程包含了QQ的代码、数据和各种资源。QQ的所有功能,比如聊天、文件传输、音视频通话等,都是在这个进程中运行的。

线程:QQ进程中的每一个功能,都可能对应一个或多个线程。比如,可能有一个线程负责接收和发送消息,一个线程负责处理用户界面,一个线程负责网络通信,一个线程负责音视频处理等。这些线程并行运行,共同完成QQ的各种功能。

比如说,当你在QQ中聊天时,你输入的每一个字都可能会触发一个事件处理线程去处理,将这个字显示在聊天窗口中;同时,还有一个网络通信线程在后台运行,不断地接收和发送消息,保持你的聊天状态是最新的。

这样的设计可以使QQ更好地响应用户的操作,提高程序的运行效率。

2.线程的创建方式

        2.1 继承Thread类(package java.lang),重写run方法

public class MyThread extends Thread{

    @Override
    public void run() {
        System.out.println("run方法的方法体就是线程执行的的内容");
    }

    public static void main(String[] args) {
        //创建Thread子类实例
        MyThread myThread = new MyThread();
        //调用start方法启动线程
        myThread.start();
    }

}

        2.2实现Runable接口,重写run方法

public class MyRunnable implements Runnable {

    @Override
    public void run() {
        System.out.println("run方法的方法体就是线程执行的内容");
    }

    public static void main(String[] args) {
        //创建Runnable实现类的实例
        MyRunnable myRunnable = new MyRunnable();
        //将实例作为Thread类的参数
        Thread thread = new Thread(myRunnable);
        //调用start方法启动线程
        thread.start();
    }
    
}

        2.3实现Callable接口重写call方法, 并使用Futuretask类

        Java 1.5开始,可以使用实现Callable接口的方式来创建线程,Callable接口的call()方法允许有返回值。然后使用FutureTask类来包装Callable对象,因为FutureTask类实现了Runnable接口,所以可以作为Thread类的参数。

public class MyCallable implements Callable<Integer> {
    @Override
    public Integer call() throws Exception {
        //call方法的方法体就是线程执行的内容
        int sum = 0;
        for (int i = 0; i < 10; i++) {
            sum += i;
        }
        return sum;
    }

    public static void main(String[] args) throws ExecutionException, InterruptedException {
        //创建Callable实现类的实例
        MyCallable myCallable = new MyCallable();
        //创建FutureTask类包装myCallable对象,因为FutureTask类实现了Runnable接口
        FutureTask<Integer> futureTask = new FutureTask<>(myCallable);
        //创建Thread类的实例,将FutureTask对象作为参数传入
        Thread thread = new Thread(futureTask);
        //调用start方法启动线程
        thread.start();

        //可以使用FutureTask的get方法来获取线程的执行结果。注意,get方法是阻塞的,它将等待直到线程执行完毕。
        System.out.println("Sum is " + futureTask.get());
    }
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值