java call网络编程底层_java多线程编程--如何开始一个线程

如何开始一个线程

1. java多线程的实现方式

1.1 继承Thread类

定义类如下:

public SubThread extends Thread {

@override

public void run() {

...

}

}使用时:

Thread subThread = new SubThread();

subThread.start();可以使用Thread类已有的函数进行操作。

1.2 实现Runnable接口

定义类如下:

public SubThread implements Runnable {

public void run() {

// doSomething...

}

}使用时:

SubThread subThread = new SubThread();

Thread thread = new Thread(subThread);

thread.start();使用该方式实现的类其实是一个普通类,只是它实现了线程的run方法,因而将其注册到Thread类的对象中才能作为一个线程运行。

1.3 实现Callable接口

类定义如下:

public SubThread implements Callable {

public String call() {

// do something...

}

}可以看出,通过这种方式实现的线程带有返回值,Callable指定返回值类型,并且Callable可以抛出异常,而Runnable则不能。

另外,查看Thread类会发现,Thread类并直接支持Callable,因而Callable要配合其他类才能好好工作。

支持Callable的途径有好几种,这里只写一种自己试验过的,其他的等以后再补充。

(1)配合FutureTask

FutureTask实现了Runnable接口和Future接口(Futur可以获取异步线程执行的返回值),因此可以利用FutureTask来实现开始线程并获取线程执行结果。

示例如下:

public class TestCallable implements Callable {

public String call() throws InterruptedException {

Thread.sleep(5000);

return "call return";

}

public static void main(String[] args) {

TestCallable test = new TestCallable();

FutureTask futrue = new FutureTask(test);

Thread thread = new Thread(futrue);

thread.start();

// 在需要结果之前,可以坐其他事

System.out.println("hello");

try {

System.out.println(futrue.get());

} catch (ExecutionException e) {

System.out.println("执行callable时出错");

} catch (InterruptedException e) {

System.out.println("执行callable时出错");

}

System.out.println("结束语");

}

}

输出结果:

hello

call return

结束语

可以看出,在要使用子线程的执行结果之前,我们可以坐一些其他事情,等需要用的时候,调用Future的get()方法就可以获取子线程的执行结果。

注意,Future的get()方法会一直阻塞到子线程执行结束。当然,我们可以使用get(long timeout, TimeUnit unit)函数来指定等待时间。

(2)TODO 配合ExecutorService

通过ExecutorService的submit方法可以执行Callable,对于线程池这一块暂时还没多少了解,后续自己实践之后再补充^ ^。

2. 总结

起始研究Thread类就能发现,extends Thread 和 implements Runable是实现一个线程的最基本的方式,FutureTask这些都是在Runnable这块基石上实现的,Callable则必须依赖其他支持它的类才能执行,不然它和线程是没有半毛钱关系的。打好底层基础对于理解一些高层的用法非常有帮助,不然只是知其然不知其所以然。就像你如果不知道TCP协议,在用java网络编程时,对于出现的一些奇怪的现象,你就不知道是底层协议的原因,还是java自身的原因一样...扯远了~~

对于上述几种方式的选择,其实按需要来就行:

extends Thread的优点是你可以直接使用父类Thread给你提供的线程操作的方法,而缺点是java的类不支持多继承,因此使用起来可能没那么自由。

implements Runnable的优点是你可以实现其他多个接口,也可以继承其他类,自由度大大提高,而缺点则是对于线程的操作,要费一点心思^ ^。相对于继承Thread类,推荐使用实现Runnable的方式,这样程序扩展性更高。

implements Callable的优点是可以返回线程执行结果,抛出异常,对于要使用其他线程的执行结果的场景来说非常有用。

版权声明:本文为博主原创文章,未经博主允许不得转载。

原文:http://blog.csdn.net/linux2_scdn/article/details/48046901

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值