Java中的多线程处理-学习笔记

35 篇文章 0 订阅

在Java中实现多线程处理的方法有两种


第一种:继承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(){
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值