package net.peace.Thread;
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Graphics;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
/**
*
* @ClassName: TestMovalBall
* @Description: 多线程初步介绍,使用swing进行演示多线程;
* @author peace w_peace@163.com
* @date Sep 19, 2015 10:34:46 AM
*
*/
public class TestMovalBall extends JFrame {
//创建画笔,画笔实现了runnable接口
private Mypanel mp;
//启动移动按键
private JButton jb;
//停止移动按键
private JButton jb1;
//启动线程的对象
private Thread th;
/**
*
* <p>Title:构造器 </p>
* <p>Description:创建窗口,和运行的球,以及注册按键监听事件,和初始化 </p>
*/
public TestMovalBall() {
//设置窗口大小
this.setSize(600,500);
//窗口位置
this.setLocation(200,100);
//关闭方式
this.setDefaultCloseOperation(EXIT_ON_CLOSE);
//开始按键的初始化
jb=new JButton("移动小球");
jb.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
// TODO Auto-genrivaerated method stub
//使线程开始运行
th.start();
}
});
//将开始按键放在顶部
this.add(jb,BorderLayout.NORTH);
//停止按键的初始化
jb1=new JButton("停止小球");
//停止按键注册监听事件
jb1.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent arg0) {
// TODO Auto-generated method stub
//停止移动,关闭线程,释放资源
mp.stopMove();
}
});
//放在底部
this.add(jb1,BorderLayout.SOUTH);
//画出球体
mp=new Mypanel(40, 50);
//加入窗口
this.add(mp);
//使窗口可见
this.setVisible(true);
//初始化线程;
th=new Thread(mp);
}
/**
*
* @ClassName: Mypanel
* @Description: 画出球体,以及线程的运行函数和停止函数;
* @author peace w_peace@163.com
* @date Sep 19, 2015 3:08:07 PM
*
*/
class Mypanel extends JPanel implements Runnable{
private int x,y;
//停止标志
private boolean flag=true;
public Mypanel(int x,int y){
this.x=x;
this.y=y;
}
//画笔,画出红色的球体
@Override
public void paint(Graphics g) {
// TODO Auto-generated method stub
super.paint(g);
g.setColor(Color.red);
g.fillOval(x, y, 50, 50);
}
//实现接口函数
@Override
public void run() {
for(int i=0;i<50;i++){
if(!flag){//falg==false时停止执行线程
flag=true;
break;
}
//使球体移动
mp.x+=3;
mp.repaint();
try {
//让线程休眠50ms
Thread.sleep(50);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
//停止线程
public void stopMove(){
//TODO 此去可以加释放资源的代码
flag=false;
}
}
public static void main(String[] args) {
//启动界面;
new TestMovalBall();
//直接使用Thread类
//建立线程类对象 并给予线程名
//此去的两个线程是独立的,不共享资源
Reflash f=new Reflash("peace1");
Reflash f1=new Reflash("peace2");
//使线程类开始运行,使用start方法,千万记住不是run
f.start();
f1.start();
//使用runnable建立线程
//建立Thread类对象,传入Runnable对象;并给予线程名
Runal run=new Runal();
//此去的两个线程是不独立的,他们互相使用同一资源,因为他们的任务对象是同一个;
Thread thread=new Thread(run,"peace3");
thread.start();
thread=new Thread(run,"peace4");
thread.start();
for(int i=1;i<10;i++){
//获得的main方法的线程名字为main,当是未给予名字的线程时,获得的名字为Thread-01依次类推
System.out.println(Thread.currentThread().getName()+":"+i);
}
}
}
/*
*创建一个简单的线程类;
*/
class Reflash extends Thread{
private int index;
//命名构造器
public Reflash(String name) {
// TODO Auto-generated constructor stub
super(name);
}
@Override
//建立run方法
public void run() {
for(;index<10;index++){
System.out.println(this.getName()+":"+index);
}
super.run();
}
}
//一般多线程百分之九十九都用这种方法;
class Runal implements Runnable{
private int index;
// 实现Runnable的run方法
@Override
public void run() {
// TODO Auto-generated method stub
for(;index<10;index++){
//获取当前线程的名字
System.out.println(Thread.currentThread().getName()+":"+index);
}
}
}