进程和线程的区别

进程是重量级的任务,需要分配给它们独立的地址空间。进程间通信是昂贵和受限的。进程间的转换也是很需要花费的。

另一方面,线程是轻量级的选手。它们共享地址空间并且共享同一个进程。线程间通信是便宜的,线程间的转换也是低成本的。

线程的生命周期

一个线程从创建到消亡的过程。线程的生命周期分为四个状态

1、创建状态

2、可运行状态

3、不可运行状态

4、消亡状态

线程的状态转换图

Java创建线程的三种方式: 1 继承Thread, 2.实现Runnable接口   3、实现Callable接口

一、Java 使用线程方式Thread和Runnable,以及Thread与Runnable的区别

<一>. java中实现线程的方式有Thread和Runnable

Thread:

  1. public class Thread1 extends Thread{
  2. @Override
  3. public void run() {
  4. System.out.println("extend thread");
  5. }
  6. }

 Runnable:

  1. public class ThreadRunable implements Runnable{
  2.  
  3. public void run() {
  4. System.out.println("runbale interfance");
  5.  
  6. }
  7.  
  8. }

 使用

  1. public static void main(String[] args) {
  2. new Thread1().start();
  3. new Thread(new ThreadRunable()).start();
  4. }

  

<二>.Thread和Runnable区别

1.在程序开发中使用多线程实现Runnable接口为主。 Runnable避免继承的局限,一个类可以继承多个接口

2. 适合于资源的共享

如下面的例子

  1. public class TicketThread extends Thread{
  2.  
  3. private int ticketnum = 10;
  4.  
  5. @Override
  6. public void run() {
  7. for(int i=0; i<20;i++){
  8. if (this.ticketnum > 0) {
  9. ticketnum--;
  10. System.out.println("总共10张,卖掉1张,剩余" + ticketnum);
  11. }
  12. }
  13. }
  14. }

  使用三个线程

  1. public static void main(String[] args) {
  2. TicketThread tt1 = new TicketThread();
  3. TicketThread tt2 = new TicketThread();
  4. TicketThread tt3 = new TicketThread();
  5. tt1.start();
  6. tt2.start();
  7. tt3.start();
  8. }

  实际上是卖掉了30张车票

而使用Runnable,如下面的例子

  1. public class TicketRunnableThread implements Runnable{
  2.  
  3. private int ticketnum = 10;
  4.  
  5. public void run() {
  6. for(int i=0; i<20;i++){
  7. if (this.ticketnum > 0) {
  8. ticketnum--;
  9. System.out.println("总共10张,卖掉1张,剩余" + ticketnum);
  10. }
  11. }
  12. }
  13. }

  使用三个线程调用

  1. public static void main(String[] args) {
  2. TicketRunnableThread trt1 = new TicketRunnableThread();
  3. new Thread(trt1).start();
  4. new Thread(trt1).start();
  5. new Thread(trt1).start();
  6. }

  因为TicketRunnableThread是New了一次,使用的是同一个TicketRunnableThread,可以达到资源的共享。最终只卖出10张车票。

3.效率对比

  1. public static void main(String[] args) {
  2.  
  3. long l1 = System.currentTimeMillis();
  4.  
  5. for(int i = 0;i<100000;i++){
  6. Thread t = new Thread();
  7. }
  8.  
  9. long l2 = System.currentTimeMillis();
  10.  
  11. for(int i = 0;i<100000;i++){
  12. Runnable r = new Runnable() {
  13. public void run() {
  14. }
  15. };
  16. }
  17.  
  18. long l3 = System.currentTimeMillis();
  19.  
  20. System.out.println(l2 -l1);
  21. System.out.println(l3 -l2);
  22. }

  在PC上的结果

  1. 119
  2. 5

  所以在使用Java线程池的时候,可以节约很多的创建时间

二、线程池

  1. public class MyCallable implements Callable<Object> {
  2.  
  3. private String taskNum;
  4.  
  5. MyCallable(String taskNum){
  6. this.taskNum = taskNum;
  7. }
  8.  
  9. @Override
  10. public Object call() throws Exception {
  11. System.out.println(">>>" + taskNum + "任务启动");
  12. Date dateTmp1 = new Date();
  13. Thread.sleep(1000);
  14. Date dateTmp2 = new Date();
  15. long time = dateTmp2.getTime() - dateTmp1.getTime();
  16. System.out.println(">>>" + taskNum + "任务终止");
  17. return taskNum +"任务返回运行结果,当前任务执行时间[" + time + "]毫秒";
  18. }
  19.  
  20. public static void main(String[] args) throws ExecutionException, InterruptedException {
  21. int taskSize = 5;
  22. //创建一个线程池
  23. ExecutorService pool = Executors.newFixedThreadPool(taskSize);
  24. //创建多个有返回值的任务
  25. List<Future> list = new ArrayList<>();
  26. for(int i = 0; i< taskSize; i++){
  27. Callable c = new MyCallable(i+ " ");
  28. //执行任务并获取Future对象
  29. Future f = pool.submit(c);
  30. list.add(f);
  31. }
  32. pool.shutdown();
  33.  
  34. for(Future f : list){
  35. //从Future对象获取任务的返回值
  36. System.out.println(">>>" + f.get().toString());
  37. }
  38.  
  39. }
  40. }

  

Java 使用线程方式Thread和Runnable,以及Thread与Runnable的区别的更多相关文章

  1. -1-5 java 多线程 概念 进程 线程区别联系 java创建线程方式 线程组 线程池概念 线程安全 同步 同步代码块 Lock锁 sleep()和wait()方法的区别 为什么wait(),notify(),notifyAll()等方法都定义在Object类中

     本文关键词: java 多线程 概念 进程 线程区别联系 java创建线程方式 线程组 线程池概念 线程安全 同步 同步代码块 Lock锁  sleep()和wait()方法的区别 为什么wait( ...

  2. java创建线程方式

    1.继承Thread类 public class ThreadCreator extends Thread{ public static void main(String[] args) { //第一 ...

  3. java笔记线程方式2

    方式2:实现Runnable接口 * 步骤: *   A:自定义类MyRunnable实现Runnable接口 *   B:重写run()方法 *   C:创建MyRunnable类的对象 *   D ...

  4. java 创建线程方式

    1.继承Thread类 子类覆写父类中的run方法,将线程运行的代码存放在run中. 建立子类对象的同时线程也被创建. 通过调用start方法开启线程. 2.实现Runnable接口 子类覆盖接口中的 ...

  5. java笔记线程方式1获取对象名称

    * 如何获取线程对象的名称呢? * public final String getName():获取线程的名称. * 如何设置线程对象的名称呢? * public final void setName ...

  6. java笔记线程方式1线程暂停yield

    public static void yield():暂停当前正在执行的线程对象,并执行其他线程. 让多个线程的执行更和谐,但是不能靠它保证一人一次. public class ThreadYield ...

  7. java笔记线程方式1线程终端与停止

    public final void stop():让线程停止,过时了,但是还可以使用.public void interrupt():中断线程. 把线程的状态终止,并抛出一个InterruptedEx ...

  8. java笔记线程方式1等待终止

    public final void join():等待该线程终止 public class ThreadJoinDemo { public static void main(String[] args ...

  9. java笔记线程方式1优先级

    * 我们的线程没有设置优先级,肯定有默认优先级. * 那么,默认优先级是多少呢? * 如何获取线程对象的优先级? *   public final int getPriority():返回线程对象的优 ...

随机推荐

  1. xml配置文件的读写

    using System.Xml; //----------------------------------------------读出XML文件中的节点值 XmlDocument xmlDoc = ...

  2. jquery插件链接

    1.jquery版本 http://www.jq22.com/jquery-info122 2.jquery属性 http://www.runoob.com/jsref/prop-radio-valu ...

  3. super作用

    super()的作用: super可以用来访问超类的构造方法和被子类所隐藏的方法,如果子类中有方法与超类中的方法名称和参数相同,则超类中的方法就被隐藏起来,也就是说在子类中重载了父类中的方法. 引用父 ...

  4. POJ 3041 -- 二分图匹配

    题意:有个N*N的网格,有一部分格子里有陨石,小明有很牛逼的武器,打一枪后一行或一列的陨石就没了,给出陨石分布,求最小打炮数. 分析:其实就是Konig定理.记最小打炮数为m,在网格里你最多可以找出M ...

  5. Html 之div+css布局之css基础

    Css是什么 CSS即层叠样式表(Cascading StyleSheet). 在网页制作时采用层叠样式表技术,可以有效地对页面的布局.字体.颜色.背景和其它效果实现更加精确的控制. 只要对相应的代码 ...

  6. HDU 5289

    http://acm.hdu.edu.cn/showproblem.php?pid=5289 给一个数列,求有多少区间,使得这些区间内的最大值减最小值小于k 单调队列的功能:O(1) 插入,删除,最大 ...

  7. Objective-C汇总

    Objective  C(20世纪80年代初) 一.OC语言概述 .1985年,Steve  Jobs成立了NeXT公司 .1996年,12月20日,苹果公司宣布收购了NeXT  softwar ...

  8. MSP430 IO 使用

    MSP430内部上拉下拉使用注意——IO口测高低电平     MSP430单片机IO口用来检测高低电平时,是不需要外部上拉下拉的,因为其内部有上拉和下拉.在用作高低电平检测时,需要开启上拉或下拉.   ...

  9. C++模板元编程(C++ template metaprogramming)

    实验平台:Win7,VS2013 Community,GCC 4.8.3(在线版) 所谓元编程就是编写直接生成或操纵程序的程序,C++ 模板给 C++ 语言提供了元编程的能力,模板使 C++ 编程变得 ...

  10. Android硬盘缓存技术DiskLruCache技术笔记

    防止多图OOM的核心解决思路就是使用LruCache技术,但LruCache只是管理了内存中图片的存储与释放,如果图片从内存中被移除的话,那么又需要从网络上重新加载一次,这显然非常耗时.因此Googl ...