⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 thread11.java

📁 java关于线程的一些实例
💻 JAVA
字号:
import java.awt.*;
import java.awt.event.*;
import java.applet.*;
import java.awt.geom.*;
import java.util.*;
public class Thread11 extends Applet implements Runnable{
	Thread hour=null,minute=null,second=null;//用来表示时针,分针和秒针的线程
    //表示时针,分针,秒针 端点的整数变量
	int hour_a,hour_b,minute_a,minute_b,second_a,second_b;
	//用来获取当前时间的整型变量
	int h=0,m=0,s=0;
	//用来绘制时针,分针和秒针的Graphics对象
	Graphics g_second=null,g_minute=null,g_hour=null;
	//用来存放表盘该度的数组,供指针走动时使用
	double point_x[]=new double[61],point_y[]=new double[61];
//	用来存放表盘该度的数组,供会制表盘使用
	double scaled_x[]=new double[61],scaled_y[]=new double[61];
	//用来判断小程序是否重新开始的变量
	int start_count=0;
	public void init(){
		g_hour=this.getGraphics();
		g_hour.setColor(Color.cyan);
		g_minute=this.getGraphics();
		g_minute.setColor(Color.red);
		g_second=this.getGraphics();
		g_second.setColor(Color.blue);
		g_second.translate(200,200);//进行坐标系变换,将新坐标系原点设在(200,200)处
		g_minute.translate(200,200);
		g_hour.translate(200,200);
		//各个时针12 点处的位置坐标(按新坐标系的坐标)
		point_x[0]=0;
		point_y[0]=-120;
		//12点处的该度位置坐标(按新坐标系的坐标)
		scaled_x[0]=0;
		scaled_y[0]=-140;
		double jiaodu=6*Math.PI/180;
		//表盘分割成60分,将分割点处的坐标存放在数组中
		for(int i=0;i<60;i++){
			point_x[i+1]=point_x[i]*Math.cos(jiaodu)-Math.sin(jiaodu)*point_y[i];
			point_y[i+1]=point_y[i]*Math.cos(jiaodu)+point_x[i]*Math.sin(jiaodu);
			
		}
		//12点处各个时针的位置坐标(按新坐标系的坐标)
		point_x[60]=0;
		point_y[60]=-120;
		//表盘分割60分,将分割点处的坐标存入在数组中
		for(int i=0;i<60;i++){
			scaled_x[i+1]=scaled_x[i]*Math.cos(jiaodu)-Math.sin(jiaodu)*point_y[i];
			scaled_y[i+1]=scaled_y[i]*Math.cos(jiaodu)+point_x[i]*Math.sin(jiaodu);
			
		}
		//12点处该度位置坐标(按新坐标系的坐标)
		scaled_x[60]=0;
		scaled_y[60]=-140;
	}
	public void start(){
		//每当小程序重新开始时,首先消灭线程,然后重新开始创建线程
		if(start_count>=1){
			second.interrupt();
			minute.interrupt();
			hour.interrupt();
		}
		second=new Thread(this);
		minute=new Thread(this);
		hour=new Thread(this);
		second.start();
		minute.start();
		hour.start();
		start_count++;
		if(start_count>=2)
			start_count=1;
	}
	public void stop(){
		second.interrupt();
		minute.interrupt();
		hour.interrupt();
	}
	public void paint(Graphics g){
		//每当小程序重新绘制自已时,重新开始创建线程
		this.start();
		//绘制表盘的外观
		g.drawOval(50,50,300,300);
		g.translate(200,200);
		//绘制表盘上的小刻度
		for(int i=0;i<60;i++){
			if(i%5==0){
				g.setColor(Color.red);
				g.fillOval((int)scaled_x[i],(int)scaled_y[i],8,8);
				
			}
			else 
				g.fillOval((int)scaled_x[i],(int)scaled_y[i],3,3);
		}
	}
	public void run(){
		//获取本地时间
		Date date=new Date();
		String str=date.toString();
		h=Integer.parseInt(str.substring(11,13));
		m=Integer.parseInt(str.substring(14,16));
		s=Integer.parseInt(str.substring(17,19));
		if(Thread.currentThread()==second){
			second_a=(int)point_x[s];
			second_b=(int)point_y[s];
			g_second.drawLine(0,0,second_a,second_b);
			g_second.drawString("秒",second_a,second_b);
			int i=s;
			while(true){
				try{
					second.sleep(1000);
					Color c=getBackground();
					g_second.setColor(c);
					g_second.drawLine(0,0,second_a,second_b);//用背占满色清除前一秒时的秒针
					g_second.drawString("秒",second_a,second_b);
					//如果这时秒针与分针重合,恢复分针的显示
					if((second_a==minute_a)&&(second_b==minute_b)){
						g_minute.drawLine(0,0,minute_a,minute_b);
						g_minute.drawString("分",minute_a,minute_b);
					}
					//如果这时秒针与时针重合,恢复时针的显示
					if((second_a==hour_a)&&(second_b==hour_b)){
						g_hour.drawLine(0,0,hour_a,hour_b);
						g_hour.drawString("时",hour_a,hour_b);
					}
				}catch(InterruptedException e){
					Color c=getBackground();
					g_second.setColor(c);
					g_second.drawString("秒",second_a,second_b);//用背景色清除秒针
					return;
				}
				//秒针向前走一个单位
				second_a=(int)point_x[(i+1)%60];
				second_b=(int)point_y[(i+1)%60];//每一秒走6度(一个单位格)
				g_second.setColor(Color.red);
				g_second.drawLine(0,0,second_a,second_b);//绘制新的秒针
				g_second.drawString("秒",second_a,second_b);
				i++;
			}
		}
		if(Thread.currentThread()==minute){
			minute_a=(int)point_x[m];minute_b=(int)point_y[m];//分针的初始位置
			g_minute.drawLine(0,0,minute_a,minute_b);
			int i=m;
			while(true){
				try{
					//第一次过60-second秒就前进一分钟,以后每过60秒前进一分钟
					minute.sleep(1000*6-s*1000);
					s=0;
					Color c=getBackground();
					g_minute.setColor(c);
					//用背景色清除前一分钟的分针
					g_minute.drawLine(0,0,minute_a,minute_b);
					g_minute.drawString("分",minute_a,minute_b);
					//如果这进分针与时针重合,恢复时针的显示
					if((hour_a==minute_a)&&(hour_b==minute_b)){
						g_hour.drawLine(0,0,hour_a,hour_b);
						g_hour.drawString("时",hour_a,hour_b);
					}
				}catch(InterruptedException e){
					return ;
				}
				//分针向前走一个单位
				minute_a=(int)point_x[(i+1)%60];
				minute_b=(int)point_y[(i+1)%60];//分针每分钟走6度(一个单位格)
				g_minute.setColor(Color.blue);
				g_minute.drawLine(0,0,minute_a,minute_b);
				g_minute.drawString("分",minute_a,minute_b);
				i++;
				s=0;
			}
		}
		if(Thread.currentThread()==hour){
			int h1=h%12;
			hour_a=(int)point_x[h1*5+m/12];
			hour_b=(int)point_y[h1*5+m/12];
			int i=h1*5+m/12;
			g_hour.drawLine(0,0,hour_a,hour_b);
			g_hour.drawString("时",hour_a,hour_b);
			while(true){
				//第一次过12-minute%12分钟就前进一个刻度,以后每过12分钟前进一个刻度
				try{
					hour.sleep(1000*60*12-1000*60*(m%12)-s*1000);
					m=0;
					Color c=getBackground();
					g_hour.setColor(c);
					g_hour.drawLine(0,0,hour_a,hour_b);
					//用背景色清除前12 分钟进的时针
					g_hour.drawString("时",hour_a,hour_b);
				}catch(InterruptedException e){
					return;
				}
				hour_a=(int)point_x[(i+1)%60];
				hour_b=(int)point_y[(i+1)%60];//时针每12分走6度(一个单位格)
				g_hour.setColor(Color.cyan);
				g_hour.drawLine(0,0,hour_a,hour_b);//绘制新的时针
				g_hour.drawString("时",hour_a,hour_b);
				i++;
				m=0;
			}
		}
	}

}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -