线程是一种工具,主要有以下用途
一 同一个进程中,不同子线程执行不同的任务
线程与线程之间没有关联,不需要共享数据,数据安全
任务:有10000个红球和10000个绿球,用两个线程同时实现将红球改成黑球、绿球改成白球。红色的球和绿色的球是不同的对象,不涉及共享数据
package lry0418;
import java.awt.*;
import java.util.ArrayList;
/**
* 任务:有10000个红球和10000个绿球,用两个线程同时实现将红球改成黑球,绿球改成白球
* 在同一个进程中(这里就是main进程)需要同时执行不同的任务(thread1和thread2)
* 线程与线程之间没有关联,不需要共享数据,数据安全
*/
public class ThreadBall0418 {
public static void main(String[] args) {
//1 需要10000个红色小球,存在列表ballList1中
ArrayList<Ball> ballList1 = new ArrayList<>(10000);//首先Ball是列表中保存的对象类型,其次这个10000是容量,可以是任意值,也可以不赋值,不是ballList1.size()的大小
System.out.println("列表的长度"+ballList1.size());//还没给列表存东西,所以ballList1.size()是0
for (int i = 0; i < 10000; i++) {//这里的i一定是个具体的值,不是ballList1.size()
ballList1.add(new Ball(new Color(255,0,0)));//给列表加入10000个红色小球,用到构造方法
}
System.out.println("列表的长度"+ballList1.size());//输出10000
//2 需要10000个绿色小球,存在ballList2中
ArrayList<Ball> ballList2 = new ArrayList<>(10000);
for (int i = 0; i < 10000; i++) {
ballList2.add(new Ball(new Color(0,255,0)));
}
//3 创建线程实现类对象t1,t2,传入待修改颜色的列表以及目标颜色
T t1 = new T(new Color(0,0,0),ballList1);//ballList1黑色
T t2 = new T(new Color(255,255,255),ballList2);//ballList2白色
//4 创建Thread对象,启动线程
Thread thread1 = new Thread(t1);
Thread thread2 = new Thread(t2);
thread1.start();
thread2.start();
// 线程对象调用join,可以知道线程是否执行完成。没有完成要插队进来完成
try {
thread1.join ();//t1线程插队
thread2.join ();//t2线程插队
} catch (InterruptedException e) {
e.printStackTrace ();}
//5 线程结束,查看列表中的小球颜色是否改变——插队确保改色已结束,也可以用sleep
for (int i = 0; i < ballList1.size(); i++) {
System.out.println(ballList1.get(i).getColor());
}
for (int i = 0; i < ballList2.size(); i++) {
System.out.println(ballList2.get(i).color);
}
}
}
//需要一个球类,属性是颜色
class Ball {
Color color;
/**
* 构造方法,在列表中创建10000个红色/绿色小球时候用的上。
* @param color
*/
public Ball(Color color) {
this.color = color;
}
public void setColor(Color color) {//run方法中对颜色的修改需要set方法
this.color = color;
}
public Color getColor() {//用于main方法中线程执行完成,打印列表中小球的颜色ballList1.get(i).getColor()。这个get方法不写也可以,直接ballList1.get(i).color()
return color;
}
}
//需要一个线程实现类,继承Runnable,重写run方法,在run方法中实现对小球颜色的更改
class T implements Runnable {
public Color color;
ArrayList<Ball> ballArrayList;
/**
* 构造方法