Java学习之多线程(1)

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接口实现多线程的方法步骤:

  1. 建立Runnable对象,并改写Runnable对象中的run()方法
  2. 使用参数为Runnable对象的构造方法创建Thread对象
  3. 调用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();
    }
}

猜你喜欢

转载自blog.csdn.net/dypnlw/article/details/80611243