不多说,直接上干货!

有4种方式可以用来创建线程:
  第一种:继承Thread类,重写run方法
  第二种:实现Runnable接口,并实现该接口的run方法(一般我们在编程的时候推荐用这种)

  第三种:实现Callable接口,重写run方法
  第四种:应用程序可以使用Executor框架来创建线程池

  

第一种:继承Thread类,重写run方法,不带返回值

  继承Thread类(真正意义上的线程类),是Runnable接口的实现。

class  MyThread extends Thread
public void
run() { 
System.out.println("Thread body");//线程的函数体
} public class Test
public static void main(String ] args) { 
MyThread thread = new MyThread ();
     thread.start();//开启线程
  } 
}

  

第二种:实现Runnable接口,实现run方法,不带返回值

  但是比继承Thread类好用,实现接口还可以继承类,避免了单继承带来的局限性;

  一般情况下,常见的是这种。

    Runnable接口有如下好处:

    ①避免点继承的局限,一个类可以继承多个接口。

    ②适合于资源的共享

  实现Runnable接口这种方式更受欢迎,因为这不需要继承Thread类。在应用设计中已经继承了别的对象的情况下,这需要多继承(而Java不支持多继承),只能实现接口。同时,线程池也是非常高效的,很容易实现和使用。

  主要步骤如下:

    (1)自定义类并实现Runnable接口,实现run方法。

    (2)创建Thread对象,用实现Runnable接口的对象作为参数实例化该Thread对象。

     (3)调用Thread的start方法。


class  MyThread implements Runable {  //创建线程类
public void
run() { 
System.out.println("Thread body");
}
} public class Test { 
public static void main(String ] args) { 
MyThread thread = new MyThread();
Thread t = new Thread(thread);
t.start(); //开启线程
}
}

第三种:实现callable接口,重写call方法,带返回值

  可以获取返回值,缺点是比较繁琐。

  Callable接口实际是属于Executor框架中的功能类,Callable接口与Runnable接口的功能类似,但提供了比Runnable更强大的功能。主要如下:

  (1)Callable可以在任务结束后提供一个返回值,而Runnable无法提供这个功能。

  (2)Callable中的call()方法可以抛出异常,而Runnable的run()方法不能抛出异常。

  (3)运行Callable可以拿到一个Future对象,Future对象表示异步计算的结果,它提供了检查计算是否完成的方法。由于线程属于异步计算模型,因此无法从别的线程中得到函数的返回值,在这种情况下,就可以使用Future来监视目标线程调用call()方法的情况。当调用Future的get()方法以获取结果时,当前线程就会阻塞,指导call()方法结束返回结果。

import  Java.util.concurrent.*;

public  class CallableAndFuture {   //创建线程类
public static class CallableTest implements Callable <String> { 
public String call() throws Exception { 
return "Hello World!";
}
} public static void main(String ] args) { 
ExecutorService threadPool = Executors.newSingleThreadExecutor();//启动线程
Future<String> future = threadPool.submit(new CallableTest());
try { 
System.out.println("waiting thread to finish");
System.out.println(future.get());//等待线程结束,并获取返回结果
} catch (Exception e) { 
e.printStackTrace();
}
  }
}

第四种:使用实现了Executor接口的ThreadPoolExecutor来创建线程池

  用Executor框架来创建,包含了很多并发处理以及线程池的方法。

牛客网Java刷题知识点之四种不同的方式创建线程的更多相关文章

  1. 牛客网Java刷题知识点之什么是进程、什么是线程、什么是多线程、多线程的好处和弊端、多线程的创建方式、JVM中的多线程解析、多线程运行图解

    不多说,直接上干货! 什么是进程? 正在进行中的程序(直译). 什么是线程? 就是进程中一个负责程序执行的控制单元(执行路径). 见 牛客网Java刷题知识点之进程和线程的区别 什么是多线程? 一个进 ...

  2. 牛客网Java刷题知识点之调用线程类的start()方法和run()方法的区别

    不多说,直接上干货! 前期博客 牛客网Java刷题知识点之四种不同的方式创建线程 这里很简单 首先,系统通过调用线程类的start()方法来启动一个线程,此时这个线程处于就绪状态,而非运行状态,也就意 ...

  3. 牛客网Java刷题知识点之为什么HashMap和HashSet区别

    不多说,直接上干货! HashMap  和  HashSet的区别是Java面试中最常被问到的问题.如果没有涉及到Collection框架以及多线程的面试,可以说是不完整.而Collection框架的 ...

  4. 牛客网Java刷题知识点之为什么HashMap不支持线程的同步,不是线程安全的?如何实现HashMap的同步?

    不多说,直接上干货! 这篇我是从整体出发去写的. 牛客网Java刷题知识点之Java 集合框架的构成.集合框架中的迭代器Iterator.集合框架中的集合接口Collection(List和Set). ...

  5. 牛客网Java刷题知识点之Map的两种取值方式keySet和entrySet、HashMap 、Hashtable、TreeMap、LinkedHashMap、ConcurrentHashMap 、WeakHashMap

    不多说,直接上干货! 这篇我是从整体出发去写的. 牛客网Java刷题知识点之Java 集合框架的构成.集合框架中的迭代器Iterator.集合框架中的集合接口Collection(List和Set). ...

  6. 牛客网Java刷题知识点之ArrayList 、LinkedList 、Vector 的底层实现和区别

    不多说,直接上干货! 这篇我是从整体出发去写的. 牛客网Java刷题知识点之Java 集合框架的构成.集合框架中的迭代器Iterator.集合框架中的集合接口Collection(List和Set). ...

  7. 牛客网Java刷题知识点之垃圾回收算法过程、哪些内存需要回收、被标记需要清除对象的自我救赎、对象将根据存活的时间被分为:年轻代、年老代(Old Generation)、永久代、垃圾回收器的分类

    不多说,直接上干货! 首先,大家要搞清楚,java里的内存是怎么分配的.详细见 牛客网Java刷题知识点之内存的划分(寄存器.本地方法区.方法区.栈内存和堆内存) 哪些内存需要回收 其实,一般是对堆内 ...

  8. 牛客网Java刷题知识点之HashMap的实现原理、HashMap的存储结构、HashMap在JDK1.6、JDK1.7、JDK1.8之间的差异以及带来的性能影响

    不多说,直接上干货! 福利 => 每天都推送 欢迎大家,关注微信扫码并加入我的4个微信公众号:   大数据躺过的坑      Java从入门到架构师      人工智能躺过的坑          ...

  9. 牛客网Java刷题知识点之UDP协议是否支持HTTP和HTTPS协议?为什么?TCP协议支持吗?

    不多说,直接上干货! 福利 => 每天都推送 欢迎大家,关注微信扫码并加入我的4个微信公众号:   大数据躺过的坑      Java从入门到架构师      人工智能躺过的坑          ...

随机推荐

  1. 报错之-Cannot set property 'onclick' of null

    当js文件放在head里面时,如果绑定了onclick或者onmouseover事件,就会出现如下图类似的错误,是因为浏览器的加载你写的html文档的顺序是从上往下,加载完按钮节点才执行的js,所以当 ...

  2. linux下go的动态链接库的使用

    转自:http://blog.csdn.net/xtxy/article/details/21328143 在使用lua进行服务器端游戏逻辑开发时,发现了LUA的各种不方便的地方,不能编译检查,不能断 ...

  3. 使用python+requests对接口进行测试

    import unittestimport requestsimport json class Login(unittest.TestCase): def setUp(self): self.base ...

  4. UI面试题(1)

    1.请创建一个数组对象[@“ad”,@“bc”,@“sdf”,@“yu”],并且对该数组对象进行排序(使用冒泡排序); NSMutableArray *array = [NSMutableArraya ...

  5. Matlab2012a下配置LibSVM—3.18

    1.下载最新版LibSVM 点击此处打开网页,点击zip file下载最新版的文件并解压放在任何目录下,建议放在安装目录便于查找.如我的文件解压在路径C:\ProgramFiles\MATLAB\R2 ...

  6. nfs(Network FileSystem)的简单配置

    如果想要在window和linux之间共享文件,那么用samba.如果仅仅想在Unix like系统之间共享文件,那么可以用NFS. 这篇文章分为两个部分,第一部分只是简单的用:照着写的步骤一步步来就 ...

  7. 报错:Caused by: org.hibernate.id.IdentifierGenerationException: ids for this class must be manually assigned before calling save(): cn.itcast.bos.domain.base.SubArea

    因为 实体类中的主键 是String类型 不能自动为其分配id  所以需要手动设置在service层   model.setId(UUID.randomUUID().toString());

  8. Entity Framework Code-First(3):Setup Environment

    Setup Development Environment for EF Code-First: Let's setup the development environment for Code-Fi ...

  9. SQL Server 练习

    use master if exists(select * from sys.databases where name='db_Test') drop database db_Test go crea ...

  10. php解析入库跟出库

    转载:http://www.jb51.net/article/39092.htm 数据放入数据库和取出来显示在页面需要注意什么 入库时 $str=addslashes($str); $sql=\&qu ...