PS:首先如果对线程、进程存在疑惑的,可以参考我的另外一篇博文——Java学习之程序、进程、线程
https://blog.csdn.net/dypnlw/article/details/80606595%20Java%E5%AD%A6%E4%B9%A0%E4%B9%8B%E7%A8%8B%E5%BA%8F%E3%80%81%E8%BF%9B%E7%A8%8B%E3%80%81%E7%BA%BF%E7%A8%8B
Java是唯一一中为PC程序员提供有效的多线程操作的编程语言,下面就来讲讲Java多线程的实现。
实现多线程的方法
Thread类
将线程要实现的功能放于Thread的run()中。用户可以通过继承Thread类,然后对run()方法进行改写,也可以在一个Runnable对象中改写。在启动线程时,通过start()方法(然后再调用run())可以启动一个新线程。start()方法启动了新线程后,程序控制立刻返回调用者。下面是具体例子
public class ThreadTest extends Thread {
private int count=0;
public void run() { //覆盖Thread的run()方法
while(true) {
System.out.print(count+" ");
count++;
if(count==10) {
break;
}
}
}
public static void main(String[] args) {
ThreadTest t=new ThreadTest();
t.start(); //start()调用run()方法运行
}
}
实现Runnable接口
Java只提供单继承,如果已经继承了其他类,就不能继承Thread类了,但是能够实现多接口,Runnable就是用于实现多线程的接口。这里提一下,查询API可知,Thread类实现了Runnable接口,其中的run()方法正是对Runnable接口中的run()方法的具体实现。
实现Runnable接口的程序会创建一个Thread对象,并将Runnable对象和Thread对象相关联,关联的方式通过Thread的构造方法实现:
public Thread(Runnable target);
public Thread(Runnable target,String name);
使用Runnable接口实现多线程的方法步骤:
- 建立Runnable对象,并改写Runnable对象中的run()方法
- 使用参数为Runnable对象的构造方法创建Thread对象
- 调用start()方法启动线程
例子代码:
//代码功能:实现一个图标的滚动效果
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; //定义一个标签来容纳图标
private static Thread t; //定义线程类
private int count;
private Container container; //获取当前窗口的容器
public SwingAndThread(){
count=0;
jl=new JLabel();
container=getContentPane();
setBounds(300,200,700,700);
container.setLayout(null); //不设置布局
URL url=SwingAndThread.class.getResource("search.png");
Icon icon=new ImageIcon(url);
jl.setIcon(icon);
jl.setHorizontalAlignment(SwingConstants.LEFT);
jl.setBounds(10, 10, 256, 256);
jl.setOpaque(true);
t=new Thread(new Runnable() { //采用匿名内部类的形式创建Runnable对象并初始化Thread
//改写run()方法
@Override
public void run() {
// TODO Auto-generated method stub
while(count<=200) {
jl.setBounds(count,10,256,256);
try {
t.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[] args) {
new SwingAndThread();
}
}