当前位置:文档之家› java多线程题目

java多线程题目

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++){
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
chamber.push(i);
}
}
});//生产者线程的压入线程
Thread t2 = new Thread(new Runnable(){// 匿名内部类public void run(){
for(int i=1;i<13;i++){
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
chamber.pop();
}
}
});//消费者线程的射出线程
t1.start();
t2.start();
}
}
class Chamber {
List<Integer> bullets;
Chamber(){
bullets=new ArrayList<Integer>();
}
public synchronized void push(Integer i){
if(bullets.size()==12){
try{
this.wait();
}catch(InterruptedException e){
e.printStackTrace();
}
}
bullets.add(i);
System.out.println("放入第"+i+"枚子弹");
this.notify();
}
public synchronized void pop(){
if(bullets.size()==0){
try{
this.wait();
}catch(InterruptedException e){
e.printStackTrace();
}
}
bullets.remove(bullets.size()-1);
System.out.println("发射一枚子弹");
this.notify();
}
}。

相关主题