java--多线程-实现线程

JAVA提供了并发机制,程序员在程序中可以执行多个线程,每个线程完成一个功能,并与其他线程并发执行。


Windows是个多任务操作系统,它以进程为单位,一个进程是一个包含自身地址的程序,每个独立执行的程序都称为进程。
也就是正在执行的程序。系统可以分配给每个进程一段有限的使用CPU的时间(也可以称为CPU时间片),CPU在这段时间中执行某个进程
然后下一个时间片又调到另一个进程中执行,由于CPU切换很快,所以是的每个进程看起来像在同一时间执行。


一个线程是进程中的执行流程,一个进程可以同时包括多个线程,每个线程也可以得到一小段程序的执行时间。这样一个进程就可以具有多个并发执行的线程。
如果一个进程需要完成多段代码的操作,就需要产生多线程。




产生线程的两种方式:
一、继承Thread类。
Thread类是java.lang包中的一个类。从这个类中实例化的对象代表线程。程序员启动一个新线程需要建立Thread实例。
Thread类中常见的构造方法:
1.public Thread(String threadName)
创建一个名称叫做threadName的县城对象。
2.public Thread();

当一个类继承Thread类就会覆盖父类中的run()方法,开启次线程则使用start()方法。

继承Threa类创建一个新线程语法:
public class ThreadTest extends Thread{

}
而真正完成功能的代码放在类中的run()方法中,
public run(){

}

使用继承Tread创建线程。

public class ThreadTest extends Thread{
	private int count = 10;
	public void run(){
		while(true){//建立无限循环。
			System.out.println(count+" ");
			if(--count==0){//时count变量自建,当自减为零时推出循环。
				return;
			}
		}
	}
	public static void main(String[] args){
		new ThreadTest().start();//启动线程
	}
}



二、实现Runnable接口。
如果需要建立一个继承其他类(非Thread)的程序,而且还要实现当前类的多线程,那么可以通过Runnable接口来实现。这种方式最多。
实现语法:
public class Thread extends Object implements Runnable

查询API发现,实质上Thread类是实现了Runnable接口,其中的run()方法正式对Runnable接口中的run()方法的实现。
实现Runnable接口的程序会创建一个Thread对象,并将Runnable对象与Thread对象相关联。

Thread类中的两个构造方法:
1.public Thread(Runnable R)
2.public Thread(Runnable R,String name);这两个构造方法的参数都存在Runnable实例,使用以上构造方法就可以将Runnable实例与Thead实例想关联。

使用Runnbale接口启动新的线程的步骤如下
1.定义类实现Runnable接口。
    2.覆盖接口中的run方法,将线程的任务代码封装到run方法中。
    3.通过Thread类创建线程对象,并将Runnable接口的子类对象作为Thead类的构造函数的参数进行传递。
     为什么:
     原因:因为线程的任务都封装在Runnable接口子类对象的run方法中。
     所以要在线程对象创建是就必须明确要运行的任务
   4.调用线程对象的start()方法开启线程。
  
实现Runnable接口,用了匿名内部类。
import java.awt.Container;
//实现runnable接口来进行多线程。
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 static final long serialVersionUID = 1L;
	private JLabel jl = new JLabel(); // 声明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"); // 获取图片的URL
		Icon icon = new ImageIcon(url); // 实例化一个Icon
		jl.setIcon(icon); // 将图标放置在标签中
		 // 设置图片在标签的最左方
		jl.setHorizontalAlignment(SwingConstants.LEFT);
		jl.setBounds(10, 10, 200, 50); // 设置标签的位置与大小
		jl.setOpaque(true);
		t = new Thread(new Runnable() { // 定义匿名内部类,该类实现Runnable接口
					public void run() { // 重写run()方法
						while (count <= 200) { // 设置循环条件
							 // 将标签的横坐标用变量表示
							jl.setBounds(count, 10, 200, 50);
							try {
								Thread.sleep(1000); // 使线程休眠1000毫秒
							} catch (Exception e) {
								e.printStackTrace();
							}
							count += 4; // 使横坐标每次增加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(); // 实例化一个SwingAndThread对象
	}
}


猜你喜欢

转载自blog.csdn.net/Anddown/article/details/77891807