美文网首页
一、【Java并发】初识线程

一、【Java并发】初识线程

作者: deve_雨轩 | 来源:发表于2019-06-10 10:11 被阅读0次

1. 线程介绍

对于计算机来说每一个任务就是一个进程,在进程运行过程中必须至少有一条线程实在运行中。线程本身是不会独立存在的,因为线程是进程中的一个执行路径。

操作系统在分配资源时是把资源分配给进程的,但是CPU资源比较特殊,它是被分配到线程的,因为真正要占用CPU运行的是线程,所以也说线程是 CPU 分配的基本单位。在Java中,当我们启动main函数时其实就启动了一个JVM的进程,而main函数所在的线程就是这个进程中的一个线程,也称主线程。

在单核CPU的计算机中,其实并没有真正的并行运算,一般是使用时间片轮转方式让线程轮询占用的,只不过快速的轮转调度带给你的错觉,让你产生了它们真的在同一时刻同时运行。当然如果是多核CPU,那么并行运行还是真实存在的。

2.JAVA中的线程创建和运行

Java中有三种线程的创建方式,分别为实现Runnable接口的run方法,集成Thread类重写run方法,使用FutureTask方式。

首先来看看Thread类方式的实现

//继承Thread,重写run方法
class MyThread extends Thread{
    
    @Override
    public void run() {
        System.out.println("run");
    }
    
}

public class ThreadTest {
    public static void main(String[] args){
        
        //创建线程
        MyThread myThread = new MyThread();
        //启动线程
        myThread.start();
    }
}

从代码中可以看出MyThread类继承了Thread类,并重写了run()方法。在 main 函数中创建了MyThread的实例并调用了start方式启动了线程。

使用继承有个不好的地方就是Java是不支持多继承的,所以如果使用了继承方式,那么就不能再继承其他类。还有就是任务与代码没有分离,当多个线程执行一样的任务时就会产生代码冗余。而Runable就没有这个限制。下面我们来看看Runnable接口的方式。

//实现Runnable接口
class MyThread implements Runnable{
    
    @Override
    public void run() {
        System.out.println("run");
    }
    
}

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

从上面代码可以看出,两个线程公用了一个代码逻辑,并且MyThread可以继承其他类。但是两种方式都有一个缺点,就是任务没有返回值。下面我们可以来看看FutureTask方式。

//实现Callable接口
class MyThread implements Callable<String>{

    @Override
    public String call() throws Exception {
        return "result";
    }
}

public class ThreadTest {
    public static void main(String[] args){
        
        //创建任务
        MyThread myThread = new MyThread();
        FutureTask<String> futureTask = new FutureTask<>(myThread);
        
        //启动线程
        new Thread(futureTask).start();
        
        try {
            //等待任务执行完成,并返回结果
            String result = futureTask.get();
            System.out.println(result);
        } catch (InterruptedException | ExecutionException e) {
            e.printStackTrace();
        }
    }
}

上面代码中的MyThread类实现了Callable接口的call()方法。在main函数中创建了一个FutrueTask对象,然后使用FutrueTask对象作为任务创建一个线程并启动。最后通过get()等待任务执行完成拿到结果。

相关文章

网友评论

      本文标题:一、【Java并发】初识线程

      本文链接:https://www.haomeiwen.com/subject/jdxyottx.html