Java中的多线程处理-学习笔记
2016-06-07 10:21
507 查看
在Java中实现多线程处理的方法有两种
第一种:继承Thread类,将需要完成的操作放在类的run()方法中,调用Thread中的start()方法就能启动线程
第二种:前一种方法需要继承Thread类来完成,但是当实现的类已经继承其他类时,就不能使用这种方法了,因为java中只允许一次继承,这时就需要用到第二种方法Runnable接口实现
Thread类有两个构造方法
public Thread(Runnable r)
public Thread(Runnable r, String name)
可以看到这两个构造方法接收Runnable对象,只需要对Thread传入实现了Runnable接口的对象,再调用start()即可
————————————————————————————————————————————————————————————————————
多线程的操作存在线程安全问题,本质上是多线程对同一个对象的读写造成的,为了避免这个问题,主要的解决方法就是同一时间只允许一个线程访问共享资源
在java中由同步块来实现,在run()方法中,把对共享数据的代码操作放在同步块中即可,当然同步块同的代码必须尽量简短,否则会影响效率
第一种:继承Thread类,将需要完成的操作放在类的run()方法中,调用Thread中的start()方法就能启动线程
public class MyThread extends Thread { private int count = 10; public void run() { while(true) { System.out.println(count); if (--count == 0) { return; } } } public static void main(String[] args) { new MyThread().start(); } }
第二种:前一种方法需要继承Thread类来完成,但是当实现的类已经继承其他类时,就不能使用这种方法了,因为java中只允许一次继承,这时就需要用到第二种方法Runnable接口实现
Thread类有两个构造方法
public Thread(Runnable r)
public Thread(Runnable r, String name)
可以看到这两个构造方法接收Runnable对象,只需要对Thread传入实现了Runnable接口的对象,再调用start()即可
import java.awt.Color; import java.awt.Graphics; import java.util.Random; import javax.swing.JFrame; public class SleepMethodTest extends JFrame{ private Thread t; private static Color[] color = {Color.BLACK, Color.BLUE, Color.CYAN, Color.green, Color.orange, Color.yellow, Color.red, Color.pink, Color.LIGHT_GRAY}; private static final Random rand = new Random(); private static Color getC() { return color[rand.nextInt(color.length)]; } public SleepMethodTest(){ t = new Thread(new Runnable() { int x = 30; int y = 50; @Override public void run() { // TODO Auto-generated method stub while (true) { try { Thread.sleep(23); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } Graphics graphics = getGraphics(); graphics.setColor(getC()); graphics.drawLine(x, y, 500, y++); graphics.drawLine(x, y, x++, 500); if (y >= 400) { y = 50; } if ( x >= 400) { x = 50; } } } }); t.start(); } public static void main(String[] args) { init(new SleepMethodTest(), 520, 500); } public static void init(JFrame frame, int width, int heigth) { frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setSize(width, heigth); frame.setVisible(true); } }
————————————————————————————————————————————————————————————————————
多线程的操作存在线程安全问题,本质上是多线程对同一个对象的读写造成的,为了避免这个问题,主要的解决方法就是同一时间只允许一个线程访问共享资源
在java中由同步块来实现,在run()方法中,把对共享数据的代码操作放在同步块中即可,当然同步块同的代码必须尽量简短,否则会影响效率
synchronized(Object){ }还有另一种方式,就是使用同步方法,对run()中的方法修饰synchronized关键字,这样该对象上的其他同步方法都必须等待当前的同步方法执行完毕后才能执行。
synchronized void f(){ }
相关文章推荐
- java对世界各个时区(TimeZone)的通用转换处理方法(转载)
- java-注解annotation
- java-模拟tomcat服务器
- java-用HttpURLConnection发送Http请求.
- java-WEB中的监听器Lisener
- Android IPC进程间通讯机制
- Android Native 绘图方法
- Android java 与 javascript互访(相互调用)的方法例子
- Python3写爬虫(四)多线程实现数据爬取
- 介绍一款信息管理系统的开源框架---jeecg
- 聚类算法之kmeans算法java版本
- java实现 PageRank算法
- PropertyChangeListener简单理解
- c++11 + SDL2 + ffmpeg +OpenAL + java = Android播放器
- 插入排序
- 冒泡排序
- 堆排序
- 快速排序