迅雷笔试题 (JAVA多线程)启动三个线程,分别打印A B C,现在写一个程序 循环打印ABCABCABC
题目: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的更多相关文章
- (Java多线程系列三)线程间通讯
Java多线程间通讯 多线程之间通讯,其实就是多个线程在操作同一个资源,但是操作的动作不同. 1.使用wait()和notify()方法在线程中通讯 需求:第一个线程写入(input)用户,另一个线程 ...
- java多线程(三)线程的安全问题
1.1. 什么是线程安全 如果有多个线程同时运行同一个实现了Runnable接口的类,程序每次运行结果和单线程运行的结果是一样的,而且其他的变量的值也和预期的是一样的,就是线程安全的:反之,则是线程不 ...
- Java 多线程(三)—— 线程的生命周期及方法
这篇博客介绍线程的生命周期. 线程是一个动态执行的过程,它也有从创建到死亡的过程. 线程的几种状态 在 Thread 类中,有一个枚举内部类: 上面的信息以图片表示如下: 第一张图: 第二张图:把等待 ...
- Java多线程系列三——实现线程同步的方法
两种实现线程同步的方法 方法 特性 synchronized 不需要显式地加解锁,易实现 ReentrantLock 需要显式地加解锁,灵活性更好,性能更优秀,结合Condition可实现多种条件锁 ...
- Java 多线程(三) 线程的生命周期及优先级
线程的生命周期 线程的生命周期:一个线程从创建到消亡的过程. 如下图,表示线程生命周期中的各个状态: 线程的生命周期可以分为四个状态: 1.创建状态: 当用new操作符创建一个新的线程对象时,该线程处 ...
- Java多线程,判断其他线程是否结束的方法
方法1:通过Thread类中的isAlive()方法判断线程是否处于活动状态. 线程启动后,只要没有运行完毕,都会返回true. [注]如果只是要等其他线程运行结束之后再继续操作,可以执行t.join ...
- 剑指Offer——迅雷笔试题+知识点总结
剑指Offer--迅雷笔试题+知识点总结 情景回顾 时间:2016.9.19 19:00-21:00 地点:山东省网络环境智能计算技术重点实验室 事件:迅雷笔试 总体来说,迅雷笔试内容体量不算多,主要 ...
- Java多线程(二) —— 线程安全、线程同步、线程间通信(含面试题集)
一.线程安全 多个线程在执行同一段代码的时候,每次的执行结果和单线程执行的结果都是一样的,不存在执行结果的二义性,就可以称作是线程安全的. 讲到线程安全问题,其实是指多线程环境下对共享资源的访问可能会 ...
- Java多线程的三种实现方式
java多线程的三种实现方式 一.继承Thread类 二.实现Runnable接口 三.使用ExecutorService, Callable, Future 无论是通过继承Thread类还是实现Ru ...
随机推荐
- 第 六 课 GO语言常量
http://www.runoob.com/go/go-constants.html 一 常量 是一个简单值的标识符,在程序运行时,不会被修改的量. 常量中的数据类型只可以是布尔型.数字型(整数型.浮 ...
- Python模块-chardet模块
chardet模块用来获取文件的编码 # -*- coding:utf-8 -*- __author__ = "MuT6 Sch01aR" import chardet f = o ...
- Java探索之旅(3)——选择与循环
1.选择结构与输出 ❶Switch语句: Switch表达式必须算出 char,byte,short,int类型数值之一,总是括号括住:Value1----ValueN,对应有相同数据类型且为常量或者 ...
- 自定义map对象,用于再不支持es6的map的时候
function Map() { this.elements = new Array(); // 获取Map元素个数 this.size = function ...
- Spring入门第二十八课
事务的传播行为 当事务方法被另一个事务方法调用时,必须指定事务应该如何传播,例如:方法可能继续在现有事务中运行,也可能开启一个新的事务,并在自己的事务中运行. 事务的传播行为可以由传播属性指定.Spr ...
- ASP.NET WebForm中JavaScript修改了页面上Label的值,如何在后台代码中获取
在用ASP.NET WebForm开发一个项目时,遇到如下的一个情况 页面上有一个Textbox控件,还有2个Label 控件. 当Textbox控件中的值更改时,两个Label控件上的值做相应的更改 ...
- 8. CTF综合靶机渗透(一)
靶机说明 虚拟机难度中等,使用ubuntu(32位),其他软件包有: PHP apache MySQL 目标 Boot to root:从Web应用程序进入虚拟机,并获得root权限. 运行环境 靶机 ...
- 面试题17:打印1到最大的n位数
// 面试题17:打印1到最大的n位数 // 题目:输入数字n,按顺序打印出从1最大的n位十进制数.比如输入3,则 // 打印出1.2.3一直到最大的3位数即999. 解题思路: 首先是一个大陷阱,n ...
- Linux常用知识点汇总
常用命令 1.ls 列出目录下的所有文件及文件夹 2.pwd 打印出当前所在目录 3. ./ 执行 .sh 文件命令 4.ip addr 查看ip地址 5.sudo service network ...
- IIS 找不到.net framework 4.0/4.5程序池
通常情况下是因为没注册造成的,也有可能跟操作系统有关系 以管理员身份运行cmd 打开我的电脑 C:\Windows\System32\cmd.exe,右键以管理员身份运行 然后:C:\WINDOW ...