先分析该名称的定义:多线程:顾名思义,多个线程运行。但是线程是个什么东西?
课本上是这样解释的:多种活动同时进行在程序中成为并发,并发完成的每一件事称为线程。
那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();
}
}
}
}
}
对于线程就学了这些,后期如果有学习再补充!!