java多线程

线程是操作系统能够进行运算调度的最小单位。它被包含在进程之中,是进程中的实际运作单位。

简单理解:应用软件中互相独立,可以同时运行的功能

并发:在同一时刻,有多个指令在单个CPU上交替执行

并行:在同一时刻,有多个指令在多个CPU上同时执行

多线程的实现方式

继承Thread类的方式进行实现

public class Mythread extends Thread{
    @Override
    public void run(){
        for (int i = 1; i <= 100; i++) {
            System.out.println(getName()+":"+i);
        }
    }
}


public class Test {
    public static void main(String[] args) {
        Mythread t1=new Mythread();
        t1.setName("线程1");
        t1.start();
    }
}

实现Runnable接口的方式进行实现

public class Mythread implements Runnable {

    @Override
    public void run() {
        for (int i = 0; i < 100; i++) {
            System.out.println(Thread.currentThread().getName() + " " + i);//这里不能直接用getName方法,因为该方法时Mythrea类的,先要获取线程对象
        }
    }
}



public class Test {
    public static void main(String[] args) {
        Mythread task=new Mythread();//这里的task不是线程,而是作为参数任务提交给线程。
        Thread t1=new Thread(task);
        t1.setName("Thread1");
        t1.start();
    }
}

利用Callable接口和Future接口方式实现

import java.util.concurrent.Callable;

public class Mythread implements Callable{
    private  int sum;
    @Override
    public Integer call() throws Exception {
        for (int i = 1; i <= 100; i++) {
            sum += i;
        }
        return sum;
    }
}



import java.util.concurrent.ExecutionException;
import java.util.concurrent.FutureTask;

public class Test {
    public static void main(String[] args) throws ExecutionException, InterruptedException {
        Mythread task=new Mythread();
        FutureTask futureTask=new FutureTask<>(task);//管理线程运行的结果
        Thread thread=new Thread(futureTask);
        thread.start();
        Integer i = futureTask.get();
        System.out.println(i);
    }
}

多线程三种实现方式对比 

实现方式 优点 缺点
继承Thread类 编程比较简单,可以直接使用Thread类中的方法 可以扩展性较差,不能再继承其他的类
实现Runnable接口 扩展性强,实现该接口的同时还可以继承其他的类 编程相对复杂,不能直接使用Thread类中的方法
实现Callable接口 扩展性强,实现该接口的同时还可以继承其他的类,有返回值 编程相对复杂,不能直接使用Thread类中的方法

常见的成员方法 

方法名称 说明
String getName() 返回此线程的名称
void setName(String name) 设置线程的名称(构造方法也可以设置名字,线程有默认的名字的
static Thread currentThread() 获取当前线程的对象
static void sleep

你可能感兴趣的:(java多线程)