Thread的第五天学习

1、如果每个线程执行的代码相同,可以使用同一个Runnable对象,这个Runnable对象中有那个
共享数据,例如:卖票系统就可以这么做!

package com.thread.demo;

public class SellTicktThreadShareData {

    public static void main(String[] args) {
        Ticket ticket = new Ticket();
        new Thread(ticket).start();
        new Thread(ticket).start();
    }
}

class Ticket implements Runnable{
    private int count = 1000;

    public void run()
    {
        while(true)
        {
            if(count <= 0)
            {
                break;
            }
            else
            {
                count--;
                System.out.println(Thread.currentThread().getName()+"卖的票还剩:"+count);
            }
        }
    }
}

2、如果每个线程执行的代码不同,这时候需要用不同的Runnable对象,下面2种方式实现Runnable对象间的数据共享:
1)将共享数据封装在另外一个对象中,然后将这个对象逐一传递给各个Runnable对象。每个线程对共享数据的操作方法也分配到那个对象身上去完成,这样容易实现针对该数据进行各个操作的互斥和通信。

package com.thread.demo;

public class MutiThreadShareData {

    public static void main(String[] args) {
        ShareData data = new ShareData();
        new Thread(new ShareThreadOne(data)).start();
        new Thread(new ShareThreadTwo(data)).start();
    }

}

class ShareThreadOne implements Runnable{
    private ShareData data ;

    public ShareThreadOne(ShareData data){
        this.data = data;
    }

    public void run()
    {
        data.decement();
    }
}

class ShareThreadTwo implements Runnable{
    private ShareData data ;
    public ShareThreadTwo(ShareData data){
        this.data = data;
    }

    public void run()
    {
        data.incement();
    }
}

class ShareData {
    int j = 0;

    public synchronized void incement()
    {
        j++;
        System.out.println(j);

    }

    public synchronized void decement()
    {
        j--;
        System.out.println(j);

    }

}

2)将这些Runnable对象作为某一个类中的内部类,共享数据作为这个外部类中的成员变量,每个线程对共享数据的操作方法也分配给外部类,以便实现对共享数据进行的各个操作的互斥和通信,作为内部类的各个Runnable对象调用外部类的这些方法。

package com.thread.demo;

public class MutiThreadShareData2 {

    private static ShareData2 data = new ShareData2();

    public static void main(String[] args) {

        new Thread(new Runnable(){

            public void run()
            {
                data.decement();
            }

        }).start();
        new Thread(new Runnable(){

            public void run()
            {
                data.incement();
            }

        }).start();
    }

}

class ShareData2 {
    int j = 0;

    public synchronized void incement()
    {
        j++;
        System.out.println(j);

    }

    public synchronized void decement()
    {
        j--;
        System.out.println(j);

    }

}

另一中共享数据模式:
  将共享数据封装在另外一个对象中,每个线程对共享数据的操作方法也分配到那个对象身上去完成,对象作为这个外部类中的成员变量或方法中的局部变量,每个线程的Runnable对象作为外部类中的成员内部类或局部内部类。

package com.thread.demo;

public class ShareDataObject {
    private static int i = 0;

    public static void main(String[] args) {
        ShareDataObject shareData = new ShareDataObject();
        for(int i= 0;i<10;i++)
        {
            new Thread(shareData.new ShareDataThread1(),i+"  1 ").start();
            new Thread(shareData.new ShareDataThread2(),i+"  2 ").start();
        }

    }

    class ShareDataThread1 implements Runnable{

        @Override
        public synchronized void run() {

            i++;
            System.out.println(Thread.currentThread().getName()+"--"+i);
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }

        }

    }

    class ShareDataThread2 implements Runnable{

        @Override
        public synchronized void run() {
            i--;
            System.out.println(Thread.currentThread().getName()+"--"+i);
        }

    }

}
时间: 2024-10-14 01:24:12

Thread的第五天学习的相关文章

201405644 嵌入式程序设计第五周学习总结

嵌入式课程设计第五周学习总结 标准 I/O 编程 标准 I/O 提供流缓冲的目的是尽可能减少使用 read()和 write()等系统调用的数量.标准 I/O 提供了 3 种类型 的缓冲存储.全缓冲.行缓冲.不带缓冲. 打开文件 打开文件有三个标准函数,分别为:fopen().fdopen()和 freopen().其中 fopen()可以指定打开文件的路径和模式,fdopen()可以指定打开的文件描述符和模式,而 freopen() 除可指定打开的文件.模式外,还可指定特定的 I/O 流. f

2014025689 《嵌入式系统程序设计》第五周学习总结

<嵌入式系统程序设计>第五周学习总结 一.6.5(标准I/O编程)主要涉及的函数及知识点 标准的I/O的三种缓冲存储:全缓冲.行缓冲.不带缓冲. 1. 全缓存:当填满标准I/O缓存后才进行实际的I/O操作 2. 行缓存:当输入或输出中遇到行结束符时,标准I/O库执行I/O操作 3. 不带缓存:标准I/O库不对字符进行缓冲 打开文件的三个标准函数:  fopen().fdopen()和 freopen(). -fopen()可以指定打开文件的路径和模式 函数原型:FILE * fopen(con

20145307《信息安全系统设计基础》第五周学习总结PT2

20145307<信息安全系统设计基础>第五周学习总结PT2: 教材学习内容总结 之前有第一部分学习总结: http://www.cnblogs.com/Jclemo/p/5962219.html 以下为第二部分 执行汇编命令:gcc –s xxx.c –o xxx.s反汇编命令:objdump –d xxx 64位处理器得到32代码的命令:gcc –m32 –s xxx.c Ltme: 1.三种操作数: 立即数:常数值.表示为$c标准表示的整数. 寄存器:表示某个寄存器的内容. 存储器:根据

信息安全设计基础第五周学习总结

信息安全系统设计基础第五周学习总结 [学习时间:10小时] [学习内容:第三章:程序的机器表示] 一.教材内容 1.X86 寻址方式的变化: 1 DOS时代的平坦模式,不区分用户空间和内核空间,很不安全: 2 8086的分段模式: 3 IA32的带保护模式的平坦模式 2.机器编程的两种抽象: 1)指令集体系结构(Instruction set architecture,ISA)——定义指令格式以及每条指令执行之后对状态的影响.大多数ISA将程序行为描述成按顺序执行的: 2)虚拟地址 3.一些处理

20145317《信息安全系统设计基础》第五周学习总结2

20145317<信息安全系统设计基础>第五周学习总结2 教材学习内容总结 X86 寻址方式经历三代: DOS时代的平坦模式,不区分用户空间和内核空间,很不安全. 8060的分段模式 IA32的带保护模式的平坦模式 程序编程 1.代码含义 gcc -01 -o p p1.c -01 表示使用第一级优化.优化的级别与编译时间和最终产生代码的形式都有关系,一般认为第二级优化-02 是较好的选择. -o 表示将p1.c编译后的可执行文件命名为p 2.机器级编程的两种抽象 指令集结构ISA 是机器级程

第五周学习进度总结

第五周学习进度总结   学习时间 新增代码行 博客量(篇) 知识总结 第五周 15h 125 2 新使用了结对编程方式,效率更高.又近一步加深了对C#语言的学习.

20145301第五周学习总结

20145301第五周学习总结 教材学习内容总结 第八章 8.1 语法与继承构架 什么是异常?在 Java 编程语言中,异常类定义程序中可能遇到的轻微的错误条件.可以写代码来处理异常并继续程序执行,而不是让程序中断. Java 提供了一种异常处理模型,它使您能检查异常并进行相应的处理.它实现的是异常处理的抓抛模型.使用此模型,您只需要注意有必要加以处理的异常情况.Java 提供的这种异常处理模型,代替了用返回值或参数机制从方法返回异常码的手段. 在 Java 中,所有的异常都有一个共同的祖先 T

Java第五周学习总结

20145307 <Java程序设计>第五周学习总结 教材学习内容总结 C8 使用try.catch打包System.in.read(),声明throws java.io.IOException. ·如果父类异常对象在子类异常前被捕捉,则catch子类异常对象的区块将永远不会被执行. ·catch括号中列出的异常不得有继承关系,否则会发生编译错误. ·在catch区块进行完部分错误处理之后,可以使用throw将异常再抛出. ·操作对象异常无法使用try.catch处理时,可由方法的客户端一句当

201671010117 2016-2017-2 《Java程序设计》Java第五周学习心得

Java第五周学习心得       通过这一周的学习,对继承有了一定的了解,但是不是很熟悉,老师上课按以前的方法讲解了第五节的懂得了更深入了一点,还需要多多敲代码来掌握的更深,因为方法突然的改变,还是有一点的不习惯,所以现在还在适应中,感觉部分知识掌握的不是很深入,还需要加强.