在Java中主要提供两种方式实现线程,分别几次java.lang.Thread类与java.lang.Runable接口
一、继承Thread类
从Thread类中实例化的对象代表线程,程序员启动一个新线程建立Thread实例。Thread类中常用的两个构造方法如下:
1、public Thread(String threadName):创建一个名称为threadName的线程对象
2、public Thread()
继承Thread类创建一个新线程的语法如下:
public class ThreadTest extends Thread{
}
Thread对象需要一个任务来执行,任务是指线程在启动时执行的工作,该工作的功能代码被写在run()方法中,语法格式如下:
public void run(){
}
通过以下实例来进行说明:
public class ThreadTest extends Thread{
private int count = 10;
public void run(){
while(true) {
System.out.print(count+" ");
if(--count == 0) {
return;
}
}
}
public static void main(String args[]) {
new ThreadTest().start();
}
}
/*输出结果如下:
10 9 8 7 6 5 4 3 2 1
*/
二、实现Runnable接口
因为Java语言是不支持多继承的,如果程序员需要继承其他类(非Thread类),而且还要使当前类实现多线程,那么可以通过Runnable接口来实现。
实现Runnable接口的语法如下:
public class Thread extends Object implements Runnable
实现Runnable接口的程序会创建一个Thread对象,并将Runnable对象与Thread对象相关联。Thread类中有以下两种构造方法:
1、public Thread(Runnable r)
2、public Thread(Runnable r,String name)
使用Runnable接口启动新的线程的步骤如下:
1、建立Runnable对象
2、使用参数为Runnable对象的构造方法创建Thread实例
3、调用start()方法启动线程
实现Runnable接口创建线程的流程图如下:
通过如下实例实现与Swing相结合创建GUI程序:
package test;
import java.awt.Container;
import java.net.URL;
import javax.swing.Icon;
import javax.swing.ImageIcon;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.SwingConstants;
import javax.swing.WindowConstants;
public class SwingAndThread extends JFrame{
private JLabel jl = new JLabel();
private static Thread t;
private int count = 0;
private Container container = getContentPane();
public SwingAndThread() {
setBounds(300,200,250,100);
container.setLayout(null);
URL url = SwingAndThread.class.getResource("/1.gif");
Icon icon = new ImageIcon(url);
jl.setIcon(icon);
jl.setHorizontalAlignment(SwingConstants.LEFT);
jl.setBounds(10,10,200,50);
jl.setOpaque(true);
t = new Thread(new Runnable() {
@Override
public void run() {
// TODO 自动生成的方法存根
while(count <= 200) {
jl.setBounds(count,10,200,50);
try {
Thread.sleep(1000);
} catch (Exception e) {
// TODO: handle exception
e.printStackTrace();
}
count += 4;
if(count == 200) {
//当图标到达标签的最右边时,使其回到标签的最左边
count = 10;
}
}
}
});
t.start();
container.add(jl);
setVisible(true);
setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
}
public static void main(String agrs[]) {
new SwingAndThread();
}
}
运行结果如下:
图标从左到右移动: