java多线程题目
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
1、当多个线程共享某个资源时,为了确保在任何时间点一个共享资源只被一个线程使用,避免造成数据的不一致,需要使用线程同步机制,线程同步有几种方式?分别如何实现?
答:有两种方式:
第一种方式:使用同步方法
synchronized void methodA(){}
第二种方式:使用同步代码块
void methodA(){
synchronized{
}
}
2、以下是一个模拟订票业务的程序。BookingClerk类代表自动售票员,其中包含一个订票(booking)方法。假设一开始有10张票可预定。程序运行时产生两个订票客户同时自动向自动售票员订票。请问会出现什么错误?该如何修改?
(考点:临界区与互斥)
public class Test {
public static void main(String args[]) {
BookingClerk bt = new BookingClerk();
new BookingTest(bt, 7);
new BookingTest(bt, 5);
}
}
class BookingClerk {
int remainder = 10;
void booking(int num) {
if (num <= remainder) {
System.out.println("预定" + num + "张票");
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
remainder = remainder - num;
} else {
System.out.println("剩余票不够,无法预定");
}
System.out.println("还剩"+remainder+"张票");
}
}
class BookingTest implements Runnable {
BookingClerk bt;
int num;
BookingTest(BookingClerk bt, int num) {
this.bt = bt;
this.num = num;
new Thread(this).start();
}
public void run() {
bt.booking(num);
}
}
答:问题:这样会出现数据可能变得不一致,且不一致的概率很高,这样是订票系统不稳定了,而且没有线程的同时访问的效果,而是就是一般的程序执行顺序,不符合实际。
应改为:
public class Test {
public static void main(String args[]) {
new Test().test();
}
public void test(){
BookingClerk bt = new BookingClerk();
Thread t1=new Thread(new BookingTest(bt, 7));
Thread t2=new Thread(new BookingTest(bt, 5));
t1.start();
t2.start();
}
}
class BookingClerk {
int remainder = 10;
synchronized void booking(int num) {
if (num <= remainder) {
System.out.println("预定" + num + "张票");
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
remainder = remainder - num;
} else {
System.out.println("剩余票不够,无法预定");
}
System.out.println("还剩"+remainder+"张票");
}
}
class BookingTest implements Runnable {
BookingClerk bt;
int num;
BookingTest(BookingClerk bt, int num) {
this.bt = bt;
this.num = num;
}
public void run() {
bt.booking(num);
}
}
3、采用Java 多线程技术,设计实现一个符合生产者和消费者问题的程序。对一个对象(枪膛)进行操作,其最大容量是12颗子弹。生产者线程是一个压入线程,它不断向枪膛中压入子弹;消费者线程是一个射出线程,它不断从枪膛中射出子弹。
要求:
(1)给出分析过程说明。
这是个生产者与消费者问题,也是线程的同步问题,
为了防止两个线程访问一个资源时出现忙等待,要使用的wait-notify函数,是两个线程交替执行;
(2)程序输出,要模拟体现对枪膛的压入和射出操作;
(2)设计程序时应考虑到两个线程的同步问题。
完成题目后参考并仔细分析以下代码
import java.util.ArrayList;
import java.util.List;
public class TestShuot {
public static void main(String[] args) {
new TestShuot().test();
}
public void test(){
final Chamber chamber=new Chamber();
Thread t1 = new Thread(new Runnable(){// 匿名内部类
public void run() {
for(int i=1;i<13;i++){