多线程的好处 :在java中通常每一个任务称为一个线程,但是多线程实现一个程序同时执行多个任务。

直接了当的说多线程可以把任务分块执行,分块后可以同时进行而不用等待。 如下载文件,

浏览网站时加载图片,通过多线程就可以实现多文件下载,一下做好几个工作,这样效率更高,

线程实现方式主要有三种:继承Thread类、实现Runnable接口、使用ExecutorService、Callable、Future实现有返回结果的多线程。其中前两种方式线程执行完后都没有返回值,只有最后一种是带返                                                                    回值的。

给大家写了一个利用多线程编程的小球在界面内循环跳动代码如下:(可复制到开源工具查看效果)

packagecom.kd;import java.awt.*;import java.awt.event.*;import javax.swing.*;public classSuper3

{public static voidmain(String[] args)

{ JFrame frame= newBounceThreadFrame();

frame.show();

}

}class BounceThreadFrame extendsJFrame

{publicBounceThreadFrame()

{ setSize(300, 200);

setTitle("Bounce");

addWindowListener(newWindowAdapter()

{public voidwindowClosing(WindowEvent e)

{ System.exit(0);

}

} );

Container contentPane=getContentPane();

canvas= newJPanel();

contentPane.add(canvas,"Center");

JPanel p= newJPanel();

addButton(p,"Start",newActionListener()

{public voidactionPerformed(ActionEvent evt)

{ Ball b= newBall(canvas);

b.start();

}

});

addButton(p,"Close",newActionListener()

{public voidactionPerformed(ActionEvent evt)

{ canvas.setVisible(false);

System.exit(0);

}

});

contentPane.add(p,"South");

}public voidaddButton(Container c, String title,

ActionListener a)

{ JButton b= newJButton(title);

c.add(b);

b.addActionListener(a);

}privateJPanel canvas;

}class Ball extendsThread

{public Ball(JPanel b) { box =b; }public voiddraw()

{ Graphics g=box.getGraphics();

g.fillOval(x, y, XSIZE, YSIZE);

g.dispose();

}public voidmove()

{if (!box.isVisible()) return;

Graphics g=box.getGraphics();

g.setXORMode(box.getBackground());

g.fillOval(x, y, XSIZE, YSIZE);

x+=dx;

y+=dy;

Dimension d=box.getSize();if (x < 0)

{ x= 0; dx = -dx; }if (x + XSIZE >=d.width)

{ x= d.width - XSIZE; dx = -dx; }if (y < 0)

{ y= 0; dy = -dy; }if (y + YSIZE >=d.height)

{ y= d.height - YSIZE; dy = -dy; }

g.fillOval(x, y, XSIZE, YSIZE);

g.dispose();

}public voidrun()

{try{ draw();for (int i = 1; i <= 1000; i++)

{ move();

sleep(5);

}

}catch(InterruptedException e) {}

}privateJPanel box;private static final int XSIZE = 10;private static final int YSIZE = 10;private int x = 0;private int y = 0;private int dx = 2;private int dy = 2;

}

还可以利用多线程做GIF转动图

使用ExecutorService、Callable、Future实现有返回结果的多线程代码如下:

packagecom.kd;importjava.util.ArrayList;importjava.util.Date;importjava.util.List;importjava.util.concurrent.Callable;importjava.util.concurrent.ExecutionException;importjava.util.concurrent.ExecutorService;importjava.util.concurrent.Executors;importjava.util.concurrent.Future;/*** Java线程:有返回值的线程

*

*@authorwb_qiuquan.ying*/@SuppressWarnings("unchecked")public classSuper4 {public static void main(String[] args) throwsExecutionException,

InterruptedException {

System.out.println("----程序开始运行----");

Date date1= newDate();int taskSize = 5;//创建一个线程池

ExecutorService pool =Executors.newFixedThreadPool(taskSize);//创建多个有返回值的任务

List list = new ArrayList();for (int i = 0; i < taskSize; i++) {

Callable c= new MyCallable(i + " ");//执行任务并获取Future对象

Future f =pool.submit(c);//System.out.println(">>>" + f.get().toString());

list.add(f);

}//关闭线程池

pool.shutdown();//获取所有并发任务的运行结果

for(Future f : list) {//从Future对象上获取任务的返回值,并输出到控制台

System.out.println(">>>" +f.get().toString());

}

Date date2= newDate();

System.out.println("----程序结束运行----,程序运行时间【"

+ (date2.getTime() - date1.getTime()) + "毫秒】");

}

}class MyCallable implements Callable{privateString taskNum;

MyCallable(String taskNum) {this.taskNum =taskNum;

}public Object call() throwsException {

System.out.println(">>>" + taskNum + "任务启动");

Date dateTmp1= newDate();

Thread.sleep(1000);

Date dateTmp2= newDate();long time = dateTmp2.getTime() -dateTmp1.getTime();

System.out.println(">>>" + taskNum + "任务终止");return taskNum + "任务返回运行结果,当前任务时间【" + time + "毫秒】";

}

}

代码说明: 上述代码中Executors类,提供了一系列工厂方法用于创先线程池,返回的线程池都实现了ExecutorService接口。 public static ExecutorService newFixedThreadPool(int nThreads)  创建固定数目线程的线程池。 public static ExecutorService newCachedThreadPool()  创建一个可缓存的线程池,调用execute 将重用以前构造的线程(如果线程可用)。如果现有线程没有可用的,则创建一个新线程并添加到池中。终止并从缓存中移除那些已有 60 秒钟未被使用的线程。 public static ExecutorService newSingleThreadExecutor()  创建一个单线程化的Executor。 public static ScheduledExecutorService newScheduledThreadPool(int corePoolSize)  创建一个支持定时及周期性的任务执行的线程池,多数情况下可用来替代Timer类。

ExecutoreService提供了submit()方法,传递一个Callable,或Runnable,返回Future。如果Executor后台线程池还没有完成Callable的计算,这调用返回Future对象的get()方法,会阻塞直到计算完成。

java多线程应用_Java多线程的应用总结相关推荐

  1. java线程钥匙_Java多线程并发编程/锁的理解

    一.前言 最近项目遇到多线程并发的情景(并发抢单&恢复库存并行),代码在正常情况下运行没有什么问题,在高并发压测下会出现:库存超发/总库存与sku库存对不上等各种问题. 在运用了 限流/加锁等 ...

  2. java线程 教程_Java多线程系列教程

    Java多线程系列教程 多线程是Java中不可避免的一个重要主体.从本章开始,我们将展开对多线程的学习.接下来的内容是对Java多线程内容的讲解,涉及到的内容包括,Object类中的wait(), n ...

  3. java 多线程 总结_Java 多线程总结

    昨天熬了个通宵,看了一晚上的视频,把java 的多线程相关技术重新复习了一遍,下面对学习过程中遇到的知识点进行下总结. 首先我们先来了解一下进程.线程.并发执行的概念: 进程是指:一个内存中运行的应用 ...

  4. java线程入门_java多线程快速入门(一)

    1.什么是进程 比如:QQ.QQ游戏.eclipse都是进程,可以通过任务管理器查看进程 2.进程和线程区别 线程是进程的一部分,一个进程可以包含多个线程,一个线程只能属于一个进程 进程是所有线程的集 ...

  5. java 高效的多线程同步_java多线程的同步和异步

    java多线程的同步和异步 Java是一种可以撰写跨平台应用软件的面向对象的程序设计语言.Java 技术具有卓越的通用性.高效性.平台移植性和安全性,广泛应用于PC.数据中心.游戏控制台.科学超级计算 ...

  6. java的多线程机制_Java多线程开发(一)| 基本的线程机制

    0. 前言 Java 为了实现跨平台,在语言层面上实现了多线程.我们只需要熟悉 Java 这一套多线程机制就行了,比 C/C++ 要容易多了. 1. 定义任务 我们编写程序,最终是为了完成特定的任务. ...

  7. java 多线程 进程_Java多线程1:进程与线程概述

    进程和线程 谈到多线程,就得先讲进程和线程的概念. 进程 进程可以理解为受操作系统管理的基本运行单元.360浏览器是一个进程.WPS也是一个进程,正在操作系统中运行的".exe"都 ...

  8. java闭合数据_java多线程中线程封闭详解

    线程封闭的概念 访问共享变量时,通常要使用同步,所以避免使用同步的方法就是减少共享数据的使用,这种技术就是线程封闭. 实现线程封闭的方法 1:ad-hoc线程封闭 这是完全靠实现者控制的线程封闭,他的 ...

  9. java线程 打印_java多线程实现 5秒一次打印当前时间

    import javax.swing.JLabel; import java.util.Date; public class Time extends JFrame implements Runnab ...

  10. java多线程系列_Java多线程实战系列

    多线程(英语:multithreading),是指从软件或者硬件上实现多个线程并发执行的技术. [1] 具有多线程能力的计算机因有硬件支持而能够在同一时间执行多于一个线程,进而提升整体处理性能.具有这 ...

最新文章

  1. 第五篇:并发控制-隔离
  2. JavaEE——JavaScript
  3. Spring Cloud Alibaba 学无止境:下一代微服务架构的规划与展望
  4. linux安装 ”NTFS“ 文件系统
  5. React Native开发错误警告处理总结(已解决 !持续更新)
  6. 利用Hadoop Streaming处理二进制格式文件
  7. 【模型解读】历数GAN的5大基本结构
  8. 多态的实现(重载,虚方法,抽象类,接口)
  9. 腾讯云数据库Redis助力百万企业远程办公
  10. python raise_python raise 使用方法
  11. 数据库sql server 2008安装。
  12. 计算机与控制工程学院烟台大学,烟台大学计算机与控制工程学院欢迎大家
  13. 项目案例:新闻发布系统---主题管理及页面新闻显示
  14. 36. LatencyTOP
  15. BGP(3):BGP 的路径优选
  16. 各种二进制特征提取算子(ORB 、BRIEF 、 FREAK、 BRISK)
  17. ruby开发以太坊智能合约
  18. linux关闭rpcbind服务,rpcbind服务 关闭
  19. 在Python中如何优雅地处理PDF文件
  20. Android游戏破解 入门级零基础起步学习破解!MT管理器+修改器使用方法 小白看了绝对有用

热门文章

  1. Hands-on ml2 - 第二章笔记
  2. 学python考什么证书比较实用_有哪些实用性很强的证书值得考?
  3. 机动车辆保费计算器V2.1版(C款)
  4. 弄清Flink1.8的远程过程调用(RPC)
  5. 大数据分析平台技术架构建设方案PPT(附下载)
  6. Gradle详细解析***
  7. 王学岗——钉钉视频会议实战,从零手写音视频会议项目
  8. 代码库 - git管理工具
  9. 大便、小便与放屁 --引用
  10. mysql中整形长度_mysql 整形的长度问题