题目:http://wenku.baidu.com/view/d66187aad1f34693daef3e8a.html

启动三个线程,分别打印A B C,现在写一个程序 循环打印ABCABCABC....

本文分别使用wait、nofity和Semaphore来实现:

wait、nofity版本

public class TestThread {

    public static void main(String[] args) {
new Thread(new OrderThread(0,'A')).start();
new Thread(new OrderThread(1,'B')).start();
new Thread(new OrderThread(2,'C')).start();
}
} class OrderThread implements Runnable {
//定义一个类静态变量的锁对象
private static Object o = new Object();
//类静态变量、用来记录是哪个线程进入运行
private static int count = 0;
//每个线程的标识,名称
private char ID;
//用来控制是线程运行的标识
private int id;
//每个线程运行的次数
private int num = 0; public OrderThread(int id,char ID) {
this.id = id;
this.ID = ID;
} public void run() {
synchronized (o) {
while (num < 10) {
if(count % 3 == id){
System.out.print(ID);
++ count;
++ num;
o.notifyAll();
}
else{
try {
o.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
}
}

Semaphore版本

public class ThreadSync {
static class ConditionThread extends Thread {
private Semaphore preCond;
private Semaphore postCond; ConditionThread(Semaphore preCond, Semaphore postCond, String name) {
this.preCond = preCond;
this.postCond = postCond;
this.setName(name);
} public void run() {
for (int i = 0; i < 10; i++) {
try {
preCond.acquire();
System.out.print(Thread.currentThread().getName());
postCond.release();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
} public static void main(String[] args) throws InterruptedException {
Semaphore semaphoreA = new Semaphore(0);
Semaphore semaphoreB = new Semaphore(0);
Semaphore semaphoreC = new Semaphore(1); Thread threadA = new ConditionThread(semaphoreC, semaphoreA, "A");
Thread threadB = new ConditionThread(semaphoreA, semaphoreB, "B");
Thread threadC = new ConditionThread(semaphoreB, semaphoreC, "C"); threadA.start();
threadB.start();
threadC.start(); // threadA.join();
// threadB.join();
// threadC.join();
}
}

2,假如有字符串“6sabcsssfsfs33” ,用最有快速的方法去掉字符“ab3”,不能用java内置字符串方法(indeOf,substring,replaceAll等)

package com.kingdee.al;

public class Test {
public static void main(String[] args) { String str = "6sabcsssfsfs33";
char[] array = { 'a', 'b', '3' };
char[] newArray = str.toCharArray();
StringBuffer sb = new StringBuffer();
for (int i = 0; i < newArray.length; i++) {
boolean isMatch = false;
for (char key : array){
if (newArray[i] == key)
isMatch = true;
}
if(!isMatch){
sb.append(newArray[i]);
}
}
System.out.println(sb.toString()); }
}

迅雷笔试题 (JAVA多线程)启动三个线程,分别打印A B C,现在写一个程序 循环打印ABCABCABC的更多相关文章

  1. (Java多线程系列三)线程间通讯

    Java多线程间通讯 多线程之间通讯,其实就是多个线程在操作同一个资源,但是操作的动作不同. 1.使用wait()和notify()方法在线程中通讯 需求:第一个线程写入(input)用户,另一个线程 ...

  2. java多线程(三)线程的安全问题

    1.1. 什么是线程安全 如果有多个线程同时运行同一个实现了Runnable接口的类,程序每次运行结果和单线程运行的结果是一样的,而且其他的变量的值也和预期的是一样的,就是线程安全的:反之,则是线程不 ...

  3. Java 多线程(三)—— 线程的生命周期及方法

    这篇博客介绍线程的生命周期. 线程是一个动态执行的过程,它也有从创建到死亡的过程. 线程的几种状态 在 Thread 类中,有一个枚举内部类: 上面的信息以图片表示如下: 第一张图: 第二张图:把等待 ...

  4. Java多线程系列三——实现线程同步的方法

    两种实现线程同步的方法 方法 特性 synchronized 不需要显式地加解锁,易实现 ReentrantLock 需要显式地加解锁,灵活性更好,性能更优秀,结合Condition可实现多种条件锁 ...

  5. Java 多线程(三) 线程的生命周期及优先级

    线程的生命周期 线程的生命周期:一个线程从创建到消亡的过程. 如下图,表示线程生命周期中的各个状态: 线程的生命周期可以分为四个状态: 1.创建状态: 当用new操作符创建一个新的线程对象时,该线程处 ...

  6. Java多线程,判断其他线程是否结束的方法

    方法1:通过Thread类中的isAlive()方法判断线程是否处于活动状态. 线程启动后,只要没有运行完毕,都会返回true. [注]如果只是要等其他线程运行结束之后再继续操作,可以执行t.join ...

  7. 剑指Offer——迅雷笔试题+知识点总结

    剑指Offer--迅雷笔试题+知识点总结 情景回顾 时间:2016.9.19 19:00-21:00 地点:山东省网络环境智能计算技术重点实验室 事件:迅雷笔试 总体来说,迅雷笔试内容体量不算多,主要 ...

  8. Java多线程(二) —— 线程安全、线程同步、线程间通信(含面试题集)

    一.线程安全 多个线程在执行同一段代码的时候,每次的执行结果和单线程执行的结果都是一样的,不存在执行结果的二义性,就可以称作是线程安全的. 讲到线程安全问题,其实是指多线程环境下对共享资源的访问可能会 ...

  9. Java多线程的三种实现方式

    java多线程的三种实现方式 一.继承Thread类 二.实现Runnable接口 三.使用ExecutorService, Callable, Future 无论是通过继承Thread类还是实现Ru ...

随机推荐

  1. Python:sample函数

    sample(序列a,n) 功能:从序列a中随机抽取n个元素,并将n个元素生以list形式返回. 例: from random import randint, sample date = [randi ...

  2. 杂项-协议-HTTP:GET/POST/PUT/DELETE/INPUT/TRACE/OPTIONS/HEAD方法

    ylbtech-杂项-协议-HTTP:GET/POST/PUT/DELETE/INPUT/TRACE/OPTIONS/HEAD方法 1.返回顶部 1. 请求方法是请求一定的Web页面的程序或用于特定的 ...

  3. 如何将OpenTSDB源码导入eclipse

    OpenTSDB的官网上介绍了如何将OpenTSDB源码导入eclipse,官方链接,但步骤超级繁琐,还有一个简便方法,下面以导入OpenTSDB2.0.0为例. 1. 下载OpenTSDB2.0.0 ...

  4. java 中Int和Integer区别以及相关示例

    Java是一个近乎纯洁的面向对象编程语言,但是为了编程的方便还是引入不是对象的基本数据类型,但是为了能够将这些基本数据类型当成对象操作,Java为每一个基本数据类型都引入了对应的包装类型(wrappe ...

  5. 调试opencv调用摄像头程序时碰到的问题

    昨天晚上想把opencv学习笔记整理一下,当跑opencv调用摄像头的程序的时候老是出现Assertion failed (size.width>0 && size.height ...

  6. servlet课堂笔记

    1.servlet生命周期: 1> 加载和实例化 2> 初始化 init() 3> 处理请求 service()->doGet()/doPost() 4> 销毁 dest ...

  7. php学习笔记-可变变量

    看一个例子. <?php $a = 'hello'; $hello = 'hi'; echo $$a; ?> 如果一个变量名前面有两个美元符号,那么这个变量就叫做可变变量.就拿上面这个举例 ...

  8. 《鸟哥的Linux私房菜》读书笔记1

    1.MBR 可以说是整个硬盘最重要的地方了,因为在 MBR 里面记录了两个重要的东西,分别是:开机管理程序,与磁盘分割表 ( partition table ).下次记得人家在谈磁盘分割的时候, 不要 ...

  9. BKReboot

    1: 重启第一台服务器(中控机),容易引起故障的组件有: appt.bkdata, 重启顺序: bkdata->appt. 2: 重启第二台服务器,容易引起故障的组件有:appo.saas-o, ...

  10. jq写的上拉刷新

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...