JAVA学习之多线程
2016-03-12 17:06
471 查看
多线程可以实现并发,JAVA中使用Thread类和Runnable接口实现。并发主要有以下两个优势:
在编程时划分模块是一个好的想法,把相关的代码写到一起,不相关的代码分开。这样的话你的代码就易懂、容易测试,而且可以减少bug。你可以使用并发把不同功能的代码分开,及时这些操作可能会同时执行。如果不使用并发的话,你就必须写一个任务切换的架构,或者在某处调用不相关的代码。
多核处理器的发展促进了并发编程。如果软件想要使用不断增强的处理器处理能力,必须使用多任务并发编程。
有2中方式来使用并发编程。第1种:这也是最常用的,把一个任务分解为多个任务,并发的执行这些分解的任务,这样就能减少总的运行时间。这叫做任务并行(task parallelism)。这个听起来很直接简单,但是这可能是一个复杂的处理过程;因为任务的不同部分之间可能有依赖关系。任务的分解或许依据处理过程:一个线程执行算法的一部分,另一个线程执行算法的其他部分;或者依据数据:每个线程运行相同的算法,但是处理的数据不同,这叫做数据并行(data parallelism)。
一、继承Thread类实现
Thread类在java.lang中,一个单线程实现的程序如下:
10 9 8 7 6 5 4 3 2 1
二、实现Runnable实现线程
也在java.lang中。实现步骤为:先创建一个Thread对象,并将Runnable对象与Thread关联,即实现Runanble接口。
一个实现的程序如下:
结果为:
10 9 8 7 6 5 4 3 2 1
结合swing的例子如下,其中得注意getResource用法:
1、使用并发来划分模块
在编程时划分模块是一个好的想法,把相关的代码写到一起,不相关的代码分开。这样的话你的代码就易懂、容易测试,而且可以减少bug。你可以使用并发把不同功能的代码分开,及时这些操作可能会同时执行。如果不使用并发的话,你就必须写一个任务切换的架构,或者在某处调用不相关的代码。
2、使用并发来提高性能
多核处理器的发展促进了并发编程。如果软件想要使用不断增强的处理器处理能力,必须使用多任务并发编程。有2中方式来使用并发编程。第1种:这也是最常用的,把一个任务分解为多个任务,并发的执行这些分解的任务,这样就能减少总的运行时间。这叫做任务并行(task parallelism)。这个听起来很直接简单,但是这可能是一个复杂的处理过程;因为任务的不同部分之间可能有依赖关系。任务的分解或许依据处理过程:一个线程执行算法的一部分,另一个线程执行算法的其他部分;或者依据数据:每个线程运行相同的算法,但是处理的数据不同,这叫做数据并行(data parallelism)。
一、继承Thread类实现
Thread类在java.lang中,一个单线程实现的程序如下:
package test01; public class ThreadTest extends Thread{ private int count=10; public void run(){ //重写run(),实现线程的功能 while (true){ System.out.print(count + " "); if (--count == 0){ //线程的停止,一般使用条件跳出循环 return; } } } public static void main(String[] args) { new ThreadTest().start(); //start()启动线程 } }结果为:
10 9 8 7 6 5 4 3 2 1
二、实现Runnable实现线程
也在java.lang中。实现步骤为:先创建一个Thread对象,并将Runnable对象与Thread关联,即实现Runanble接口。
一个实现的程序如下:
package test01; public class ThreadTest1 { private static Thread t; private static int count=10; public static void main(String[] args) { // TODO Auto-generated method stub t=new Thread(new Runnable(){ public void run(){ while(true){ System.out.print(count + " "); try { Thread.sleep(500); //休眠0.5s }catch(Exception e) { e.printStackTrace(); } if (--count == 0){ //线程的停止 return; } } } }); t.start(); } }
结果为:
10 9 8 7 6 5 4 3 2 1
结合swing的例子如下,其中得注意getResource用法:
package test01; import java.awt.*; import java.net.*; import javax.swing.*; public class SwingThread extends JFrame { private static final long serialVersionUID = 1L; private JLabel jl = new JLabel(); private static Thread t; private int count = 0; private Container container = getContentPane(); // 声明容器 public SwingThread() { setBounds(300, 200, 250, 100); container.setLayout(null); URL url = SwingThread.class.getResource("1.gif"); // 此处得注意放在bin下.class文件路径中 Icon icon = new ImageIcon(url); jl.setIcon(icon); jl.setHorizontalAlignment(SwingConstants.LEFT); jl.setBounds(10, 10, 200, 50); jl.setOpaque(true); t = new Thread(new Runnable() { // 匿名内部类实现Runnable接口 public void run() { // 重写run()方法 while (count <= 200) { jl.setBounds(count, 10, 200, 50); try { Thread.sleep(100); } catch (Exception e) { e.printStackTrace(); } count += 4; if (count == 200) { // 当图标到达标签的最右边,使其回到标签最左边 count = 10; } } } }); t.start(); container.add(jl); setVisible(true); setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE); } public static void main(String[] args) { new SwingThread(); } }
相关文章推荐
- Leetcode:160. Intersection of Two Linked Lists(JAVA)
- 20145215《Java程序设计》第2周学习总结
- Spring 事务管理
- java SE多线程(关于runnable接口实现多线程)
- java中值传递和引用传递
- spring error
- JAVA多线程和并发基础
- java位运算符
- Eclipse快捷键大全
- Java中的迭代器
- java设计模式3-单例模式
- Java项目--坦克大战1
- JAVA设计模式--策略模式
- java基础知识(三)
- java从键盘读取数据
- Struts2默认拦截器解析
- Java NIO和IO的区别
- 浅谈Java中的equals和==
- 常用eclipse 和 android studio 快捷键对比
- java中static 和 final关键字用法