java多线程基础知识简单应用-电子时钟
参考文档《java语言程序设计》-13章多线程实现电子时钟
首先是继承Thread类实现多线程:这段程序可以初步了解线程的“同时执行”,运行可以发现每次运行的结果都是不同的。
Threads.java
package project1_Thread;
public class Threads {
public static void main(String[] args) {
// TODO Auto-generated method stub
for(int i=0;i<10;i++){
System.out.println("main begins:");
}
Threads1 nt1 = new Threads1();
Threads2 nt2 = new Threads2();
nt1.start();
nt2.start();
for(int i=0;i<10;i++){
System.out.println("Main End");
}
}
}
class Threads1 extends Thread {
public void run(){
for(int i=1;i<=50;i++){
//输出1到50的数
System.out.print(i+" ");
}
}
}
class Threads2 extends Thread {
public void run(){
for(char c='A';c<='Z';c++){
//输出A-Z
System.out.print(c+" ");
}
for(char c='a';c<='z';c++){
//输出a-z
System.out.print(c+" ");
}
}
}
方法二是实现Runable接口来实现多线程。多数简单的多线程程序都可以通过继承Thread类实现多线程。然而当一个类已经继承了已有的父类时,由于java不支持多继承,实现Runnable接口就成了实现多线程的解决办法。
程序示例:
<pre name="code" class="java">Threads.java
package project3_Runnable;
public class Threads {
public static void main(String[] atgs){
for(int i=0;i<10;i++){
System.out.println("main begins:");
}
Threads1 t1 =new Threads1();
Threads2 t2 =new Threads2();
//实例化实现接口的对象
Thread th1=new Thread(t1);
Thread th2=new Thread(t2);
//使用Thread创建实现Runnable接口的线程
th1.start();
th2.start();
for(int i=0;i<10;i++){
System.out.println("Main End");
}
}
}
class Threads1 implements Runnable {
public void run(){
for(int i=1;i<=50;i++){
//输出1到50的数
System.out.print(i+" ");
}
}
}
class Threads2 implements Runnable{
public void run(){
for(char c='A';c<='Z';c++){
//输出A-Z
System.out.print(c+" ");
}
for(char c='a';c<='z';c++){
//输出a-z
System.out.print(c+" ");
}
}
}
注意,在创建Thread对象时,参数必须为一个实现了Runnable接口的对象。·
以上两段代码包含了实现多线沉的两种方法,以下是采用多线程实现一个简单的小程序-电子时钟:
package project_ch13;
import java.awt.Color;
import java.awt.Font;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.text.SimpleDateFormat;
import java.util.Date;
import javax.swing.JFrame;
import javax.swing.JLabel;
public class ClockFrame extends JFrame{
JLabel lbClock=null;//创建一个标签
public ClockFrame(){
lbClock=new JLabel(getDate());
//lbClock=new JLabel("**********BEGIN*********");
//实例化lbClock标签,其title为动态调用getDate方法
lbClock.setFont(new Font("黑体",Font.BOLD,50));
lbClock.setForeground(Color.red);
//设置标签字体以及标签中字的颜色
this.add(lbClock);
//将标签添加到窗体中
this.addMouseListener(new MouseAdapter(){
public void mouseClicked(MouseEvent e){
if(e.getClickCount()==2){
System.exit(0);
}
}
});
//注册监听器,监听鼠标事件,mouseAdapter中的方法都已经封装,直接实现功能即可
this.setUndecorated(true);
//窗体无边框
this.pack();
//窗口大小自适应
this.setLocationRelativeTo(null);
//窗体居中
this.setVisible(true);
//窗体可见;
//创建并启动线程,使时间不断地显示在屏幕上
new Thread(new Runnable(){
//在创建Thread对象时直接使用一个匿名的Run那边了对象实现线程中的方法。
public void run() {
while(true){
//无限循环休眠1000ms
try{
Thread.sleep(1000);
}catch(InterruptedException e){
//扑捉发生在线程中的异常,当一个正在执行的线程被中断时就会出现这个异常,添加catch后当程序被双击停止时不会出现错误
e.printStackTrace();
}
lbClock.setText(getDate());
}
}
}).start();//启动Thread方法,这个Thread方法也是匿名的。
}
private String getDate() {
//这个方法属于java中常见的获取当前时间并格式化输出的例子
SimpleDateFormat df=new SimpleDateFormat("hh时:mm分:ss秒");
//确定时间的格式
return df.format(new Date());
//new Date取当前系统时间,使用创建的格式实例格式化返回去到的时间。
}
public static void main(String[] args) {
// TODO Auto-generated method stub
new ClockFrame();
}
}
练习代码,仅为初学者自我激励,欢迎交流,欢迎打脸吐槽。