【java】多线程

先分析该名称的定义:多线程:顾名思义,多个线程运行。但是线程是个什么东西?

课本上是这样解释的:多种活动同时进行在程序中成为并发,并发完成的每一件事称为线程。

那Java中用什么来表示线程呢?

实现线程有两种方式:继承Thread类+实现Runnable接口。

分别举例来说明一下

 

/*
Runnable接口  
使用Thread类输出
*/ 

package com.lzw;

public class ThreadTest extends Thread { // 指定类继承Thread类
	private int count = 10;
	
	public void run() { // 重写run()方法
		while (true) {
			System.out.print(count+" "); // 打印count变量
			if (--count == 0) { // 使count变量自减,当自减为0时,退出循环
				return;
			}
		}
	}
	
	public static void main(String[] args) {
		new ThreadTest().start();
	}
}
输出:10 9 8 7 6 5 4 3 2 1 /*
 * 将图标放入标签中,使用Thread中延时的方式,将标签向右移动
 * */
package com.lzw;
import javax.swing.*;
import java.awt.*;
import java.net.URL;

public class SwingAndThread extends JFrame {
	private JFrame jf = new JFrame("移动的标签");  // 创建窗体
	private Container contianer = jf.getContentPane(); // 创建窗体的容器
	private JLabel jl = new JLabel("移动标签");
	private static Thread t;   // 创建Thread对象
	private int count = 10;
	
	public SwingAndThread() {		
		jf.setBounds(20, 20, 300, 200);
		jf.setVisible(true);
		contianer.setLayout(null);		
		jl.setBounds(count, 10, 300, 100);		
		URL url = SwingAndThread.class.getResource("imageButtoo.jpg");
		Icon icon = new ImageIcon(url);
		jl.setIcon(icon);
		t = new Thread(new Runnable() {
			public void run() {
				try {
					while(count <= 200) {
						jl.setBounds(count, 10, 100, 100);
						contianer.add(jl);
						count += 10; 
						t.sleep(1000);	 // Thread延时	
						if(count==200){
							count = 10;
						}
					}
				}catch(Exception e) {
					e.printStackTrace();
				}					
			}			
		});
		t.start();
	}		
	
	public static void main(String[] args) {
		new SwingAndThread();
	}	
}

这两个有什么区别?

继承Thread类:不能继承类

实现Runnable接口:可以继承其他类+在创建Thread类的对象的基础上使用Runnable(run()函数需要重构)

既然可以实现线程,那多线程有是怎么回事呢?

多线程当然是多个线程运行,那运行又有多种不同,我们来看一下下面这几种情况。

 

/*
多个线程同时进行

 * 设置四个进度条运行的情况
	 * 创建线程+进度条
	 * 设置进度条显示+布局
	 * 线程进度实例化+开启
	 * 进程的表现形式都是一样的(创建接口,缩短程序)
 * 设置线程的优先级
 	 * thread1.setPriority(1);  // 1~10之间
 * */
package com.lzw;
import java.awt.*; // FlowLayout
import javax.swing.*;  // JFrame+JProgressBar

public class PriorityTest extends JFrame {
	private Thread thread1 = new Thread();  // 创建线程
	private Thread thread2 = new Thread();
	private Thread thread3 = new Thread();
	private Thread thread4 = new Thread();	
	private JProgressBar jprogressBar1 = new JProgressBar();  // 创建进度条
	private JProgressBar jprogressBar2 = new JProgressBar();
	private JProgressBar jprogressBar3 = new JProgressBar();
	private JProgressBar jprogressBar4 = new JProgressBar();
	
	public static void init(JFrame frame, int weight, int height) {
		frame.setBounds(10, 10, weight, height);
		frame.setVisible(true);		
	}
	
	public static void main(String[] args) {
		init(new PriorityTest(), 100, 200);
	}
	
	PriorityTest() {
		// 设置进度条显示+布局
		getContentPane().setLayout(new FlowLayout(1, 10, 10));  // 进度条布局+加入容器
		getContentPane().add(jprogressBar1);
		getContentPane().add(jprogressBar2);
		getContentPane().add(jprogressBar3);
		getContentPane().add(jprogressBar4);
		jprogressBar1.setStringPainted(true);  // 进度条带有数值显示
		jprogressBar2.setStringPainted(true);
		jprogressBar3.setStringPainted(true);
		jprogressBar4.setStringPainted(true);
		// 线程进度实例化+开启
		thread1 = new Thread(new MyThread(jprogressBar1));  // 为线程添加实例化		
		thread2 = new Thread(new MyThread(jprogressBar2));
		thread3 = new Thread(new MyThread(jprogressBar3));
		thread4 = new Thread(new MyThread(jprogressBar4));
		thread1.start();   // 线程启动
		thread2.start();
		thread3.start();
		thread4.start();
	}
	
	private final class MyThread implements Runnable {
		private JProgressBar bar;
		private int count = 0;
		
		public MyThread(JProgressBar bar) {
			this.bar = bar;			
		}
		
		public void run() {
			while(true) {
				bar.setValue(count += 10);
				try {
					Thread.sleep(500);
					if(count == 100) {
						count = 0;
					}
				} catch(Exception e) {
					e.printStackTrace();
				}
			}		
		}		
	}
		
}
/*
 * 两个线程,先后进行
	 * 初始化两个线程+两个进度条
	 * 设置布局结构+显示状态
	 * 线程设置
 * 进度条
	 * 初始化 :private JProgressBar progressBarA = new JProgressBar();
	 * 设置布局:getContentPane().add(progressBarA, BorderLayout.NORTH); 
	 * 设置数值:progressBarA.setValue(count++);
	 * 显示数值:progressBarA.setStringPainted(true);
 * */
package com.lzw;
import java.awt.BorderLayout;
import javax.swing.*; // JFrame+JProgressBar


public class JoinTest extends JFrame {
	private Thread threadA;   // 线程声明
	private Thread threadB;
	private JProgressBar progressBarA = new JProgressBar();  // 进度条声明
	private JProgressBar progressBarB = new JProgressBar(); 
	
	public static void main(String[] args) {
		init(new JoinTest(), 100, 200);
	}
	
	// 设置窗体各种属性方法
	public static void init(JFrame frame, int weight, int height) {
		frame.setBounds(10, 10, weight, height);
		frame.setVisible(true);	
	}
	 
	public JoinTest() {
		getContentPane().add(progressBarA, BorderLayout.NORTH);  // 进度条布局
		getContentPane().add(progressBarB, BorderLayout.SOUTH);
		progressBarA.setStringPainted(true);   // 进度条显示数值
		progressBarB.setStringPainted(true);
		
		threadA = new Thread(new Runnable() {
			public void run() {
				int count = 0;
				while(true) {
					progressBarA.setValue(count++);   // 进度条设置数值
					try{
						threadA.sleep(100);
						threadB.join();						
					}catch(Exception e) {
						e.printStackTrace();
					}
				}				
			}
		});
		threadA.start();
		
		threadB = new Thread(new Runnable() {
			public void run() {
				int count = 0;
				while(true) {
					progressBarB.setValue(count++);
					try{
						threadB.sleep(100);					
					}catch(Exception e) {
						e.printStackTrace();
					}
					if(count == 100) {     // 进度条B结束后直接退出,进入进度条A
						break;
					}
				}				
			}
		});
		threadB.start();
	}
	
}/*
 线程有优先级 
 
 * 设置四个进度条运行的情况
	 * 创建线程+进度条
	 * 设置进度条显示+布局
	 * 线程进度实例化+开启
	 * 进程的表现形式都是一样的(创建接口,缩短程序)
 * 设置线程的优先级
 	 * thread1.setPriority(1);  // 1~10之间
 * */
package com.lzw;
import java.awt.*; // FlowLayout
import javax.swing.*;  // JFrame+JProgressBar

public class PriorityTest extends JFrame {
	private Thread thread1 = new Thread();  // 创建线程
	private Thread thread2 = new Thread();
	private Thread thread3 = new Thread();
	private Thread thread4 = new Thread();	
	private JProgressBar jprogressBar1 = new JProgressBar();  // 创建进度条
	private JProgressBar jprogressBar2 = new JProgressBar();
	private JProgressBar jprogressBar3 = new JProgressBar();
	private JProgressBar jprogressBar4 = new JProgressBar();
	
	public static void init(JFrame frame, int weight, int height) {
		frame.setBounds(10, 10, weight, height);
		frame.setVisible(true);		
	}
	
	public static void main(String[] args) {
		init(new PriorityTest(), 100, 200);
	}
	
	PriorityTest() {
		// 设置进度条显示+布局
		getContentPane().setLayout(new FlowLayout(1, 10, 10));  // 进度条布局+加入容器
		getContentPane().add(jprogressBar1);
		getContentPane().add(jprogressBar2);
		getContentPane().add(jprogressBar3);
		getContentPane().add(jprogressBar4);
		jprogressBar1.setStringPainted(true);  // 进度条带有数值显示
		jprogressBar2.setStringPainted(true);
		jprogressBar3.setStringPainted(true);
		jprogressBar4.setStringPainted(true);
		// 线程进度实例化+开启
		thread1 = new Thread(new MyThread(jprogressBar1));  // 为线程添加实例化		
		thread2 = new Thread(new MyThread(jprogressBar2));
		thread3 = new Thread(new MyThread(jprogressBar3));
		thread4 = new Thread(new MyThread(jprogressBar4));
		thread1.setPriority(1);   // 设置线程的优先级
		thread1.setPriority(1);
		thread1.setPriority(10);
		thread1.setPriority(10);
		thread1.start();   // 线程启动
		thread2.start();
		thread3.start();
		thread4.start();
	}
	
	private final class MyThread implements Runnable {
		private JProgressBar bar;
		private int count = 0;
		
		public MyThread(JProgressBar bar) {
			this.bar = bar;			
		}
		
		public void run() {
			while(true) {
				bar.setValue(count += 10);
				try {
					Thread.sleep(500);
					if(count == 100) {
						count = 0;
					}
				} catch(Exception e) {
					e.printStackTrace();
				}
			}		
		}		
	}
		
}

对于线程就学了这些,后期如果有学习再补充!!

 

 
 
 
 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值