java线程

1.创建和运行线程

方法一:直接使用Thread

@Slf4j
public class Test1 {
    public static void main(String[] args) {
        Thread t = new Thread(){
            @Override
            public void run(){
                log.debug("t1线程running");
            }
        };
        t.setName("t1"); //为线程指定名称,也可以用构造来指定new Thread("t1")
        t.start();
        log.debug("主线程running");
    }
}

方法二:使用Runnable配合Thread

把【线程】和【任务】分开,实现Runnable接口run方法写任务代码,创建Thread对象,通过构造传递runnable参数,达到创建线程、并实现任务的目的。

Thread代表线程,Runnable可运行的任务(线程要执行的代码)

@Slf4j
public class Test2 {
    public static void main(String[] args) {
        Runnable runnable = new Runnable() {
            @Override
            public void run() {
                log.debug("t2-running");
            }
        };
        Thread thread = new Thread(runnable,"t2");
        thread.start();
        log.debug("main-running");
    }
}

lambda表达式写法(如果接口只有一个成员方法,该接口会被@FunctionalInterface注解标注,表示该成员方法支持函数表达式写法,见下图,idea中可以使用快捷键Alt+Enter来帮你生成)。

 

 上面方法二的函数表达式写法:


@Slf4j
public class Test2 {
    public static void main(String[] args) {
        Runnable runnable = ()->{log.debug("t2-running");};
        Thread thread = new Thread(runnable,"t2");
        thread.start();
        log.debug("main-running");
    }
}

 原理之Threa与Runnable对象的关系

通过刨析源码,实际上,利用Thread构造方法来传递runnable对象的方法,实际上在方法的内部,将runnable对象赋值给了Thread的成员变量target ,target这个成员变量,实际上在Thread对象中调用了run方法,所以,方法二实际上走的还是Thread对象的run方法,与方法一直接重载run方法在本质上是一致的。

小结:

方法一是把线程和任务合并在一起了,方法二是把线程和任务分开了

用Runnable更容易与线程池等高级API配合

用Runnable让任务类脱离了Thread继承体系,更加灵活(Java里组合优于继承)

方法三:FutureTask配合Thread

FutureTask能够接收Callable类型的参数,用来处理有返回结果的情况

@Slf4j
public class Test3 {
    public static void main(String[] args) throws ExecutionException, InterruptedException {
        FutureTask<Integer> futureTask = new FutureTask<>(() -> {
            log.debug("t1-running");
            Thread.sleep(1000);
            return 100;
        });

        Thread thread = new Thread(futureTask,"t1");
        thread.start();
        log.debug("main-running,{}",futureTask.get());

    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

weixin明诚

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值