实现线程(3种方法)

实现线程
1.第一种方式:
编写一个类,直接继承java.lang.Thread,重写run方法

package com;

import java.io.*;

public class Test {
    public static void main(String[] args) throws IOException {
        //这里是main方法。这里代码是属于主线程,在主栈中运行。
        //新建一个分支线程对象
        MyThread myThread = new MyThread();
        //启动线程
        //myThread.run();//不会启动线程。不会分配新的分支栈(这种方式是单线程)
        //start方法作用:启动一个分支线程,是在jvm中开辟一个新的栈空间,这端段代码的任务完成后,瞬间就结束了
        //这段代码的任务是为了开辟一个新的栈空间,只要新的栈空间开出来了,start()方法就结束了,线程就启动成功了。
        //启动成功的线程会自动 的调用run方法,并且run方法在分支栈的栈底部(压栈)。
        //run方法在分支栈的栈底部,main方法在主栈的栈底部。run和main是平级。
       // myThread.start();
        //这里的代码还是运行在主线程里
        for (int i = 0; i < 1000; i++) {

            System.out.println("主线程" + i);
        }
    }
}


class MyThread extends Thread {
    @Override
    public void run() {
        //编写程序,这段程序运行在分支线程中(分支栈)
        for (int i = 0; i < 1000; i++) {
            System.out.println("分支线程" + i);
        }
    }
}

run()和start()区别
调用start方法实现多bai线程,而调用run方法没有实du现多线程
在这里插入图片描述
2.实现线程第2种方式
编写一个类实现java.lang.Runnable接口。

package com;

import java.io.*;

public class Test {
    public static void main(String[] args) throws IOException {

        //  创建线程对象,采用匿名类方式
        //这是一个通过没名字的类,new出来的对象
        Thread thread = new Thread(new Runnable() {
            @Override
            public void run() {
                for (int i = 0; i < 1000; i++) {
                    System.out.println("主线程----->" + i);
                }
            }
        });
        //启动线程
        thread.run();
        for (int i = 0; i < 100; i++) {
            System.out.println("main线程------>" + i);
        }
    }
}

3.实现线程第2种方式
实现线程第三种方式
实现Callable接口
优点:可以获取线程的执行结果
缺点:当前线程阻塞,效率低

import java.text.ParseException;
import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.FutureTask;

/**
 * 实现线程第三种方式
 * 实现Callable接口
 * 优点:可以获取线程的执行结果
 * 缺点:当前线程阻塞,效率低。
 */
public class test {
    public static void main(String[] args) throws ParseException, ExecutionException, InterruptedException {

        //第一步:创建“未来任务”对象
        FutureTask task = new FutureTask(new Callable() {
            @Override
            public Object call() throws Exception {//call()相当于run().只不过这个有返回值

                //线程执行一个任务,执行后有一个返回值
                //模拟线程

                System.out.println("begin");
                Thread.sleep(1000 * 10);

                System.out.println("over");
                int a = 100;
                int b = 200;

                return a + b;//自动装箱变300,Integer
            }
        });
        //创建线程对象
        Thread t = new Thread(task);

        //启动线程
        t.start();

        //这里是mian方法,在主线程
        //在主线程中。怎么获取t线程返回结果
        //get()会导致当前线程阻塞
        Object o = task.get();

        System.out.println("结果是"+o);
        //main方法必须等get();
        System.out.println("helloworld");
    }
}
©️2020 CSDN 皮肤主题: 游动-白 设计师:上身试试 返回首页
实付 9.90元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值