2011-09-06 java多线程同步

首先解决一下昨天的问题。下面是这两个题的答案。

题一:

import java.awt.BorderLayout;
import javax.swing.JFrame;
import javax.swing.JLabel;
class GunDongZiMu extends JFrame implements Runnable{
	JLabel txtLabel;
	String str;
	public GunDongZiMu(String str){
		super("字幕滚动");
		this.str=str;
		txtLabel=new JLabel(); 
		
		setLayout(null);
		add(txtLabel);
		txtLabel.setBounds(0,242,250,15);
		setSize(255,300);
		setVisible(true);
		setLocation(500,200);
		setDefaultCloseOperation(EXIT_ON_CLOSE);
	}

	public void run(){//run方法实现字幕的滚动
		for(int i=0;i<str.length();i++){
			txtLabel.setText(str.substring(i)+str.substring(0,i));
			if(i==str.length()-1)
				i=0;
			try{
				Thread.sleep(200);
			}catch(InterruptedException e){
				e.toString();
			}
		}
	}

	public static void main(String[] args) {
		GunDongZiMu g1=new GunDongZiMu("2011-CSDN-JAVA-04-JAVA-多线程作业  ");
		Thread tt=new Thread(g1);
		tt.start();
	}
}

题二:

import javax.swing.JFrame;
import javax.swing.ImageIcon;
import javax.swing.JLabel;
class HuanDengPian extends JFrame implements Runnable{
	JLabel imageLabel;//主要利用JLabel中的setIcon(new ImageIcon(m))方法切换图片
	public HuanDengPian(){
		super("幻灯片播放器");
		imageLabel=new JLabel(new ImageIcon("f:/image/1.jpg"));
		
		add(imageLabel);
		setSize(500,500);
		setVisible(true);
		setLocation(500,200);
		setDefaultCloseOperation(EXIT_ON_CLOSE);
	}
	public void run(){//run方法实现幻灯的切换
		while(true){
			int i=(int)(Math.random()*5)+1;//产生一个随机数用来显示该显示那张图片
			imageLabel.setIcon(new ImageIcon("f:/image/"+i+".jpg"));
			try{
				Thread.sleep(1500);
			}catch(InterruptedException e){
				e.toString();
			}
		}
	}
	public static void main(String[] args) {
		HuanDengPian h1=new HuanDengPian();
		Thread tt=new Thread(h1);
		tt.start();
	}
}

这是比较好的方法了。

今天学了java中多线程同步问题。同步问题说的是:一个两个线程共享一个资源,当线程1访问这个资源时,若线程1还没来得及对这个数据更新而另线程2又来读取这个数据这时线程2读到的这个数据是更新之前数值,就出现了不同步的问题。要解决这个问题就是用synchronized标记 用它来标记方法或对象用来表示独一性,也就是说:当线程1调用这个方法或访问这个数据时其它线程是不允许调用这个方法或访问这个数据,必须等线程1死亡才能访问。

今天的作业是:写一个抢票程序。(一个票有一个号码,也就是说两个人买到的票必须是不同号码的。)

答案代码:

class QiangPiao extends Thread{
	PiaoNumber pn;
	String name;
	public QiangPiao(PiaoNumber pn,String name){
		this.name=name;
		this.pn=pn;
	}
	public void run(){
		try{
			pn.print(name);
			Thread.sleep(1000);
		}catch(InterruptedException e){
			e.toString();
		}
	}
	public static void main(String[] args) {
		PiaoNumber pn=new PiaoNumber();
		QiangPiao person1=new QiangPiao(pn,"小五");
		QiangPiao person2=new QiangPiao(pn,"小六");
		person1.start();
		person2.start();
	}
}

class PiaoNumber{
	int number;
	public PiaoNumber(){
		number=14414;
	}
	public synchronized void print(String name1){
		System.out.println(name1+"抢到了"+number+"号票");
		number--;
	}
}

类PiaoNumber中的number是线程person1和person2共享的资源。

你可能感兴趣的:(java,thread,多线程,String,import,作业)