P02 线程的用途

本文介绍了Java线程的用途,包括在同一进程中不同线程执行不同任务时的数据安全,线程构造方法、join、yield和sleep的用法。接着讨论了同一进程中执行相同任务时的线程协作,涉及资源共享和线程同步问题。最后探讨了流水线任务,强调了线程间操作顺序的重要性,并通过代码示例展示了无序执行导致的问题。
摘要由CSDN通过智能技术生成

线程是一种工具,主要有以下用途

一 同一个进程中,不同子线程执行不同的任务

线程与线程之间没有关联不需要共享数据,数据安全

任务:有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;
    /**
     * 构造方法
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值