一个java多线程实例

import java.util.List;
import java.util.ArrayList;
import java.util.Queue;
import java.util.LinkedList;
public class Test3 {
    public static void main(String[] args) {
        final Manager3 m3 = new Manager3();
        m3.init();
        Thread t1 = new Thread(new Runnable() {
            public void run() {
                while (true) {
                    if (m3.getter.q.size() > 0) {
                        TestData3 td = m3.getter.q.pop();
                        System.out.println(td.getName());
                    } else {
                        try {wait();} catch (Exception e) {}
                    }
                }
            }
        });
        t1.start();
    }
}
class TestData3 {
    String type;
    String id;
    String name;
    TestData3(String type, String id, String name) {
        this.type = type;
        this.id = id;
        this.name = name;
    }
    String getName() {
        return name;
    }
}
class TestDataQueue3 {
    Queue<TestData3> q = new LinkedList<TestData3>();
    void push(TestData3 td) {
        q.offer(td);
    }
    TestData3 pop() {
        return q.poll();
    }
    long size() {
        return q.size();
    }
}
class Manager3 {
    Getter3 getter = new Getter3();
    Setter3 setter = new Setter3();
    Adapter3 adapter = Setter3.adapter;
    void init() {
        adapter.addGetter(getter);
        setter.regist();
        setter.putData();
        adapter.listenData();
    }
}
class Getter3 {
    TestDataQueue3 q = new TestDataQueue3();
    void update(TestData3 data) {
        q.push(data);
    }
}
class Adapter3 {
    TestDataQueue3 q = new TestDataQueue3();
    List<Getter3> glst = new ArrayList<Getter3>();
    List<Setter3> slst = new ArrayList<Setter3>();
    void addGetter(Getter3 g) {
        glst.add(g);
    }
    void addSetter(Setter3 s) {
        slst.add(s);
    }
    void listenData() {
        Thread t = new Thread(new Runnable() {
            public void run() {
                while (true) {
                    if (q.size() > 0) {
                        broadcast(q.pop());
                    } else {
                        try {
                            wait();
                        } catch (Exception e) {}
                    }
                }
            }
        });
        t.start();
    }
    void broadcast(TestData3 td) {
        for (int i = 0; i < glst.size(); i++) {
            glst.get(i).update(td);
        }
    }
}
class Setter3 {
    static final Adapter3 adapter = new Adapter3();
    void regist() {
        adapter.addSetter(this);
    }
    void putData() {
        Thread t = new Thread(new Runnable() {
            public void run() {
                int i = 0;
                while (true) {
                    TestData3 td = new TestData3("computer", "c" + String.format("%08d", i), "computer" + i);
                    adapter.q.push(td);
                    i++;
                    try {
                        Thread.sleep(1000);
                        notify();
                    } catch (Exception e) {}
                }
            }
        });
        t.start();
    }
}
时间: 2024-12-05 14:42:40

一个java多线程实例的相关文章

Java多线程-实例解析

Java多线程实例 3种实现方法Java中的多线程有三种实现方式:1.继承Thread类,重写run方法.Thread本质上也是一个实现了Runnable的实例,他代表一个线程的实例,并且启动线程的唯一方法就是通过Thread类的start方法.2.实现Runnable接口,并实现该接口的run()方法.创建一个Thread对象,用实现的Runnable接口的对象作为参数实例化Thread对象,调用此对象的start方法.3.实现Callable接口,重写call方法.Callable接口与Ru

java多线程实例

Java的多线程机制 实例一: //题目:有三个线程分别打印A.B.C,请用多线程编程实现,在屏幕上循环打印10次ABCABC- public class SleepExample extends Thread {            private static int currentCount = 0;            public SleepExample(String name) {            this.setName(name);        }         

java多线程实例---很有用 详细介绍

实现线程的方式有两种: 1.继承java.lang.Thread,并重写它的run()方法,将线程的执行主体放入其中. 2.实现java.lang.Runnable接口,实现它的run()方法,并将线程的执行主体放入其中. ==多线程的执行逻辑: 当主线程被挂起时, 其它就绪的线程会根据选择最 实现线程的方式有两种: 1.继承java.lang.Thread,并重写它的run()方法,将线程的执行主体放入其中. 2.实现java.lang.Runnable接口,实现它的run()方法,并将线程的

一个java多线程面试题

线程a 打印 数字 0--12: 线程b 打印 字母 a--z; 打印结果:0ab1cd2ef3gh4ij5kl6mn7op8qr9st10uv11wx12yz 要求用到 线程间传值: 分析:线程a打印一个数字,线程b打印两个字母 , 进行13次循环, 通过公共资源类进行线程间传值 public class FftThreadTest {public static void main(String[] args) { //创建final资源对象 final Business business =

java多线程实例(2)

public class ThreadDemo05 { public static void main(String args[]) { // 四个售票点应该控制同一个资源 Demo d = new Demo() ; Thread t1 = new Thread(d) ; Thread t2 = new Thread(d) ; Thread t3 = new Thread(d) ; Thread t4 = new Thread(d) ; t1.start() ; t2.start() ; t3.

使用JVMTI获取Java多线程程序指令执行次序

使用JVMTI获取Java多线程程序指令执行次序 在Java多线程程序中,由于线程调度,指令间的次序在每次运行时都可能不相同,有时候,我们需要得到指令次序,用来分析程序的行为.这样细粒度的底层行为用一般方法很难完成,我们需要借助 JVM Tool Interface,即JVMTI,来帮助我们获取Java虚拟机执行时的信息.本文先介绍编写JVMTI程序的基本框架,然后介绍如何使用JVMTI来获取多线程程序中指令之间的次序. JVMTI简介 JVMTI是用于编写开发与监视工具的编程接口,使用它可以检

Java Tread多线程(0)一个简单的多线程实例

作者 : 卿笃军 原文地址:http://blog.csdn.net/qingdujun/article/details/39341887 本文演示,一个简单的多线程实例,并简单分析一下线程. 编程多线程时,一般步骤: 1)继承Thread函数. 2)覆盖run函数. 注意:1)main函数为主线程,main里面存放的是主线程的执行代码: Demo1为子线程,里面的run函数里面存放的是子线程需要执行的代码:其中,本文中主线程和子线程执行的优先级是一样的. 2)启动线程必须用start()启动,

Java 多线程 简单实例 (消费者与生成者)的关系

PS::线程这套东西在PHP里完全是不存在的概念,有待进一步的学习: PS::这个实例是根据书本上的知识进行扩展的,理解程度50%左右吧! 1.定义生产消费环境 package second; public class Queue { int value = 0; boolean isEmpty = true; /** * 生产者 * @param v */ public synchronized void put(int v){ if(!isEmpty){//如果存在数据没有被消费 try{

java多线程并发去调用一个类的静态方法安全性探讨

java多线程并发去调用一个类的静态方法安全性探讨 转自:http://blog.csdn.net/weibin_6388/article/details/50750035 这篇文章主要讲多线程对静态方法访问的数据安全性 总结如下: 1,java在执行静态方法时,会在内存中拷贝一份,如果静态方法所在的类里面没有静态的变量,那么线程访问就是安全的,比如在javaee中服务器必然会多线程的处理请求此时如果设计全局需要调用的静态方法,可用此种设计. 2,java在执行静态方法时,如果使用静态变量,同时