Java多线程

2019-02-09  本文已影响0人  Kevin_Huang54

进程与线程

线程的创建方法

public class MyThread extends Thread{
    public static void main(String[] args) {
        //创建对象,通过start方法启动线程
        MyThread myThread = new MyThread();
        myThread.start();
    }

    @Override
    //重写run方法
    public void run() {
        System.out.println("启动线程");;
    }
}
//实现Runnable接口
public class MyThread implements Runnable{
    public static void main(String[] args) {
        //通过Thread类的有参构造器,传入实现了Runnable接口的类
        Thread myThread = new Thread(new MyThread());
        myThread.start();
    }

    @Override
    //实现run方法
    public void run() {
        System.out.println("启动线程");;
    }
}

可以简化为匿名类方式实现Runnable接口

public class MyThread{
    public static void main(String[] args) {
        //通过Thread类的有参构造器,传入Runnable接口
        //用匿名类实现Runnable接口
        Thread myThread = new Thread(new Runnable() {
            @Override
            public void run() {
                System.out.println("线程启动");
            }
        });
        myThread.start();
    }
}

由于Runnable是函数式接口,可以直接用Lambda表达式实现:

public class MyThread{
    public static void main(String[] args) {
        //通过Thread类的有参构造器,传入Runnable接口
        //用Lambda表达式实现接口
        Thread myThread = new Thread(() -> System.out.println("线程启动"));
        myThread.start();
    }
}
public class MyThread implements Callable<String> {
    public static void main(String[] args) throws ExecutionException, InterruptedException {
        //通过FutureTask包装Callable接口
        FutureTask<String> futureTask = new FutureTask<>(new MyThread());
        //通过Thread的构造器传入Callable接口
        new Thread(futureTask).start();
        //可获取返回值
        System.out.println(futureTask.get());
    }

    @Override
    public String call() throws Exception {
        return "线程启动";
    }
}

线程的状态

状态 说明
新建 new创建线程后,还未调用start运行
就绪 1、调用start后,JVM为其创建方法调用栈和程序计数器,线程试图抢占cpu资源
2、阻塞解除后,线程试图抢占cpu资源
运行 抢占到cpu资源,开始执行run方法
阻塞 1、线程调用sleep方法
2、调用了一个阻塞式IO方法
3、执行到了wait方法,等待notify
4、试图获取同步监视器(synchronize),但该同步监视器被其他线程占有
死亡 run方法执行完成
或者,线程抛出未捕获的异常
线程状态示意图

控制线程

Thread thread = new Thread(new MyThread()); 
thread.start(); 
//join后,主线程会被阻塞,等待thread线程结束后,才重新执行主线程 
thread.join(); 
//参数表示主程序的等待时间为1000ms,超过时间则不再等待
thread.join(1000);
上一篇下一篇

猜你喜欢

热点阅读