多线程编程基础试题及权威答案解析_第1页
多线程编程基础试题及权威答案解析_第2页
多线程编程基础试题及权威答案解析_第3页
多线程编程基础试题及权威答案解析_第4页
多线程编程基础试题及权威答案解析_第5页
已阅读5页,还剩16页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

多线程编程基础试题及权威答案解析考试时间:______分钟总分:______分姓名:______一、选择题(每题只有一个正确选项,请将正确选项字母填入括号内)1.在Java中,创建线程的两种主要方式是?()A.继承`Thread`类和实现`Runnable`接口B.继承`Thread`类和实现`Callable`接口C.实现`Runnable`接口和实现`Thread`类D.继承`Runnable`类和实现`Callable`接口2.下列哪个方法用于让当前线程进入休眠状态,指定的时间过后线程会自动恢复运行?()A.`stop()`B.`yield()`C.`join()`D.`sleep()`3.在Java中,`synchronized`关键字可以实现线程同步,它修饰的方法或代码块的作用范围是?()A.对象级别,任何线程调用此对象的方法或访问此对象同步代码块都需要获得锁B.类级别,所有实例对象的方法或代码块都共享同一把锁C.线程级别,同一时刻只有一个线程能执行该线程的所有同步方法或代码块D.方法内部局部变量级别,只对当前方法局部变量范围内的数据同步4.下列哪个锁是Java中`synchronized`关键字的底层实现之一?()A.`ReentrantLock`B.`ReadWriteLock`C.`Semaphore`D.`CountDownLatch`5.当多个线程需要访问共享资源,且必须保证在同一时刻只有一个线程能访问该资源时,主要应用的是哪种同步机制?()A.原子操作B.互斥锁C.条件变量D.线程池6.在多线程环境下,如果程序执行的结果依赖于线程的执行顺序,且得不到确定的结果,则出现了?()A.线程阻塞B.线程死锁C.竞态条件D.优先级反转7.下列哪个Java集合类是线程安全的?()A.`ArrayList`B.`LinkedList`C.`HashMap`D.`Vector`8.Java中的`ExecutorService`接口用于管理线程池,创建一个固定大小为5,使用LinkedBlockingQueue作为工作队列的线程池,应使用哪个构造函数?()A.`Executors.newFixedThreadPool(5)`B.`Executors.newCachedThreadPool()`C.`Executors.newSingleThreadExecutor()`D.`Executors.newScheduledThreadPool(5)`9.`CountDownLatch`的主要作用是?()A.用于实现线程间的信号通知,让一个或多个线程等待其他一组线程完成操作B.用于限制同时访问某个资源的线程数量C.用于在线程间传递数据D.用于协调多个线程的执行顺序,确保它们按特定顺序执行10.在多线程编程中,死锁通常由以下哪些条件引起?()A.互斥条件、占有并等待条件、非抢占条件和循环等待条件B.互斥条件、占有并等待条件、非抢占条件和随机等待条件C.互斥条件、占有并等待条件、可抢占条件和循环等待条件D.互斥条件、占有并等待条件、非抢占条件和公平等待条件11.`ReentrantLock`与`synchronized`相比,有哪些优势?()A.可以提供更灵活的锁公平性设置B.可以实现锁分段,提高并发性能C.可以提供锁的尝试获取和中断获取功能D.以上都是12.当使用`synchronized`修饰静态方法时,锁对象是?()A.当前对象实例B.当前类对应的`Class`对象C.`Thread`对象D.`Runtime`对象二、多选题(每题有多个正确选项,请将所有正确选项字母填入括号内)1.下列哪些是创建Java线程的方式?()A.继承`Thread`类并重写`run()`方法,然后调用`start()`方法B.实现`Runnable`接口并重写`run()`方法,然后创建`Thread`对象传入此`Runnable`实例,再调用`start()`方法C.使用`Thread`类的构造函数直接传入一个实现了`Runnable`接口的匿名类D.实现`Callable`接口并重写`call()`方法,然后使用`FutureTask`封装,再提交给`ExecutorService`2.下列哪些方法是`Thread`类中用于控制线程生命周期的常用方法?()A.`start()`B.`run()`C.`join()`D.`sleep(longmillis)`3.`synchronized`关键字可以实现哪些功能?()A.方法同步B.代码块同步C.实现线程之间的通信D.实现线程互斥4.常见的线程安全问题包括?()A.数据竞争B.竞态条件C.死锁D.优先级反转5.Java中的`volatile`关键字可以用于实现哪些目的?()A.保证变量的可见性B.保证变量的原子性C.简化线程间的同步D.防止指令重排序6.线程池`ExecutorService`的好处包括?()A.重用线程,减少创建和销毁线程的开销B.控制并发线程的数量,避免系统资源被过度占用C.提高系统对任务调度的响应速度D.隐藏复杂的管理细节7.下列哪些属于并发容器(线程安全或提供了并发支持)?()A.`Hashtable`B.`Vector`C.`ConcurrentHashMap`D.`CopyOnWriteArrayList`8.以下哪些是`ReentrantLock`提供的比`synchronized`更灵活的功能?()A.公平锁与非公平锁的选择B.可中断的锁获取尝试(`tryLock()`可带超时)C.锁的绑定多个条件(`Condition`)D.锁的尝试获取(`tryLock()`)和可中断获取9.以下哪些方法是`Object`类中定义的,可用于实现线程间的协作或同步?()A.`wait()`B.`notify()`C.`notifyAll()`D.`synchronized()`10.使用线程池时,可能会遇到哪些问题?()A.拒绝策略的选择与配置B.队列溢出C.线程泄漏D.核心线程数与最大线程数的合理配置三、填空题(请将答案填入横线处)1.在Java中,每个`Thread`对象默认继承自类的对象。2.Java中实现多线程的一种常见方式是创建一个实现了接口的类。3.`synchronized`关键字修饰的代码块,其锁对象是调用该代码块的实例对象。4.线程`t`进入阻塞状态等待I/O操作完成,可以使用`t.`方法。5.当多个线程需要获取同一资源,但允许多个线程同时获取(只要不冲突),可以使用类实现。6.Java中的`AtomicInteger`类利用了CAS(Compare-And-Swap)机制来实现对整数的操作。7.创建一个可缓存线程池,它会根据需要创建新线程,但会优先使用空闲线程,应使用`Executors.new()`方法。8.`ReentrantLock`是Java中实现可重入互斥锁的一种方式,它需要配合方法来释放锁。9.`volatile`关键字可以确保变量在所有线程中的可见性,但它不能保证复合操作的原子性。10.当一个线程调用另一个线程的`join()`方法时,调用线程会等待被调用线程执行完毕后才继续执行。四、简答题1.请简述进程和线程的区别。2.请解释什么是竞态条件,并举例说明。3.请简述`synchronized`关键字和`ReentrantLock`的主要区别。4.请说明线程池有哪些好处?配置线程池时需要考虑哪些主要参数?5.请解释什么是死锁,并至少列出三种避免死锁的方法。五、编程题请编写一个Java程序,包含一个`BankAccount`类,该类有一个私有的`balance`变量表示余额。提供一个`deposit(intamount)`方法用于存款,和一个`withdraw(intamount)`方法用于取款。这两个方法都需要是线程安全的。在主方法中,创建一个`BankAccount`对象,并启动5个线程,其中3个线程向账户存入100元,2个线程从账户取出50元。最后打印出最终的账户余额。要求使用`synchronized`关键字实现线程安全。试卷答案一、选择题1.A解析思路:Java中创建线程主要有两种方式,一是继承`Thread`类并重写`run`方法,二是实现`Runnable`接口并提供`run`方法实现。实现`Callable`接口通常与`FutureTask`结合使用,用于有返回值的线程。因此A选项正确。2.D解析思路:`sleep()`方法使当前线程进入休眠状态,指定的毫秒数或纳秒数过去后线程会自动恢复运行。`stop()`已废弃,可能导致资源泄露或不一致。`yield()`是让出当前CPU时间片,不一定会停止执行。`join()`是等待指定线程执行完毕。因此D选项正确。3.A解析思路:`synchronized`修饰方法时,锁是当前对象实例,即`this`。修饰静态方法时,锁是当前类对应的`Class`对象。无论是方法还是代码块,其作用范围都是对象级别,确保同一时间只有一个线程能执行该对象(或类)的同步方法/代码块。因此A选项正确。4.A解析思路:`ReentrantLock`是Java实现的显式锁,提供了比`synchronized`更丰富的功能(如公平性设置、可中断等待、条件变量等)。`synchronized`是隐式锁,其底层实现可能涉及锁升级等,但`ReentrantLock`本身就是其一种实现方式之一。`ReadWriteLock`是读写锁,`Semaphore`是信号量,`CountDownLatch`是计数器。因此A选项正确。5.B解析思路:互斥锁(Mutex)的核心作用就是保证在同一时刻,只有一个线程能访问共享资源,从而防止数据不一致或损坏。这正是互斥锁解决的核心问题。原子操作关注的是单个操作的原子性,条件变量用于线程通信,线程池用于管理线程资源。因此B选项正确。6.C解析思路:竞态条件(RaceCondition)是指多个线程对共享数据的访问存在依赖关系,且至少有一个线程的操作不是原子性的,导致最终程序状态依赖于线程的执行顺序,结果不确定或错误。线程阻塞是线程因等待资源而暂停。死锁是线程相互等待对方持有的资源,导致都无法继续。优先级反转是高优先级线程被低优先级线程阻塞。因此C选项正确。7.D解析思路:在Java中,`Vector`和`Hashtable`是早期提供的线程安全的集合类。而`ArrayList`、`LinkedList`、`HashMap`本身是线程不安全的。`Collections.synchronizedList(newArrayList<>())`或`Collections.synchronizedMap(newHashMap<>())`可以包装成线程安全的集合,但`Vector`和`Hashtable`本身就是线程安全的。因此D选项正确。8.A解析思路:`Executors.newFixedThreadPool(intnThreads)`创建一个固定大小的线程池,最多有nThreads个线程。`newCachedThreadPool()`创建一个可缓存线程池,会根据需要创建新线程,但会优先使用空闲线程。`newSingleThreadExecutor()`创建一个单线程的线程池。`newScheduledThreadPool(intcorePoolSize)`创建一个可以执行定时任务和周期性任务的线程池。因此A选项正确。9.A解析思路:`CountDownLatch`的主要作用是让一个或多个线程等待其他一组线程完成操作。它通过计数器实现,初始计数器设为线程数量,每个线程完成一项任务后调用`countDown()`,主线程调用`await()`等待计数器归零。`Semaphore`用于限制同时访问某个资源的线程数量。`FutureTask`用于异步计算结果。`CyclicBarrier`用于让一组线程互相等待,直到所有线程都到达一个共同的屏障点。因此A选项正确。10.A解析思路:死锁的发生需要满足四个必要条件:互斥条件(资源不能共享)、占有并等待条件(线程至少占有一个资源,并等待其他线程占有的资源)、非抢占条件(资源不能被强制剥夺)、循环等待条件(存在一个线程循环等待链)。因此A选项正确。11.D解析思路:`ReentrantLock`相比`synchronized`的优势在于:提供了更灵活的锁公平性设置(可配置公平或非公平锁);提供了可中断的锁获取尝试(`tryLock()`可带超时);提供了`Condition`对象,可以实现更精细的线程通信;可以实现锁分段。因此D选项正确。12.B解析思路:`synchronized`修饰静态方法时,锁对象是当前类对应的`Class`对象,而不是实例对象。修饰实例方法时,锁对象是当前实例对象。因此B选项正确。二、多选题1.A,B,C,D解析思路:创建Java线程的方式包括:继承`Thread`类并重写`run()`方法,然后调用`start()`方法(A)。实现`Runnable`接口并重写`run()`方法,然后创建`Thread`对象传入此`Runnable`实例,再调用`start()`方法(B)。使用`Thread`类的构造函数直接传入一个实现了`Runnable`接口的匿名类(C)。实现`Callable`接口并重写`call()`方法,然后使用`FutureTask`封装,再提交给`ExecutorService`(D)。这四种方式都是合法且常见的创建线程的方法。2.A,C,D解析思路:`start()`方法用于启动线程,使线程进入就绪状态,等待CPU调度。`run()`方法是线程执行的主体,`start()`调用后会执行`run()`方法中的代码。`join()`方法用于使当前线程等待指定线程执行完毕。`sleep(longmillis)`方法使当前线程进入阻塞状态指定时间。`run()`不是用于控制生命周期的直接方法,而是线程执行的内容。因此A,C,D选项正确。3.A,B,D解析思路:`synchronized`关键字可以修饰实例方法(锁当前对象实例)和静态方法(锁当前类对应的`Class`对象),实现方法同步(A)。也可以修饰代码块,指定锁对象(B)。它通过内置锁机制实现线程互斥,确保同一时间只有一个线程能执行同步的方法或代码块(D)。但它不能直接实现线程间的复杂通信,需要配合`wait()`,`notify()`,`notifyAll()`等方法或`Condition`对象。因此A,B,D选项正确。4.A,B,C,D解析思路:线程安全问题通常源于共享数据被不安全地访问。数据竞争(A)是指两个或多个线程访问同一共享变量,并且至少有一个是写操作。竞态条件(B)是导致数据竞争的情景或结果,即程序行为依赖于线程的执行顺序。死锁(C)是多个线程因互相持有对方需要的资源而永久阻塞。优先级反转(D)是指高优先级线程被低优先级线程阻塞,导致系统资源利用效率降低或响应延迟。这些都是多线程环境下的常见问题。5.A,D解析思路:`volatile`关键字的主要作用是保证变量的可见性(A),即一个线程对变量的修改能及时被其他线程看到。它通过禁止指令重排序(D)来实现可见性和一定程度的原子性保证,但它不能保证复合操作(如`i++`)的原子性。原子性需要使用原子类或同步机制。因此A,D选项正确。6.A,B,C,D解析思路:线程池的主要好处包括:线程复用(A),减少创建销毁开销;控制并发数(B),避免资源耗尽;提高响应速度(C),任务提交给线程池通常比直接新建线程快;隐藏管理细节(D),简化了并发编程的复杂性。因此A,B,C,D选项都正确。7.A,B,C,D解析思路:`Hashtable`和`Vector`是早期Java提供的线程安全的集合类,它们通过内部加锁实现同步,效率相对较低。`ConcurrentHashMap`是后来提供的并发集合,性能更好,通常允许多个读写操作并发进行。`CopyOnWriteArrayList`是写时复制列表,读操作不加锁,写操作复制一份数组。这些都是线程安全或提供并发支持的集合。因此A,B,C,D选项正确。8.A,B,C解析思路:`ReentrantLock`提供了比`synchronized`更灵活的功能:可以指定锁的公平性(true为公平,false为非公平),而`synchronized`默认是非公平的(A)。`ReentrantLock`的`tryLock()`方法可以尝试获取锁而不阻塞,并可以设置超时时间,而`synchronized`只能阻塞等待(B)。`ReentrantLock`提供了`Condition`对象,允许线程在特定条件下等待和通知,比`synchronized`的`wait()`,`notify()`,`notifyAll()`更灵活(C)。锁分段是`Lock`分解锁的概念,不是`ReentrantLock`本身的直接功能。因此A,B,C选项正确。9.A,B,C解析思路:在`Object`类中定义了用于线程同步和协作的方法:`wait()`使当前线程进入等待状态,释放对象锁(如果持有),直到其他线程调用该对象的`notify()`或`notifyAll()`方法(或锁被其他线程获取)。`notify()`唤醒在此对象上等待的一个线程。`notifyAll()`唤醒在此对象上等待的所有线程。`synchronized()`不是`Object`类的方法,而是`synchronized`关键字本身,用于获取和释放内置锁。因此A,B,C选项正确。10.A,B,C,D解析思路:使用线程池时可能遇到的问题包括:需要根据业务选择合适的拒绝策略(如`AbortPolicy`,`CallerRunsPolicy`,`DiscardPolicy`,`DiscardOldestPolicy`),并进行配置(A)。如果任务过多,队列可能溢出(B)。线程池中的线程如果没有正确关闭,或者任务执行过程中发生异常未处理,可能导致线程泄漏(C)。线程池的核心线程数和最大线程数的配置不合理,可能导致资源浪费(过多空闲线程)或响应慢(线程不足)。因此A,B,C,D选项都正确。三、填空题1.`Object`解析思路:在Java中,所有类默认都继承自`Object`类,包括`Thread`类。因此每个`Thread`对象默认继承自`Object`类的对象。2.`Runnable`解析思路:实现`Runnable`接口是创建Java线程的两种主要方式之一。通过实现`Runnable`接口并将其实例传递给`Thread`对象,可以避免单继承的局限性,并且更符合面向对象的设计思想。3.对象解析思路:当`synchronized`关键字修饰一个实例方法时,它获取的锁是调用该方法的那个对象实例的锁(即`this`)。当修饰一个静态方法时,它获取的锁是当前类的`Class`对象。无论是哪种情况,锁的作用范围都是对象级别。4.`join()`解析思路:`join()`方法会等待指定的线程(传入的`Thread`对象)执行完毕后,再继续执行调用`join()`的线程。如果当前线程需要等待某个线程完成其I/O操作,可以调用该I/O线程的`join()`方法。5.`Semaphore`解析思路:信号量(`Semaphore`)允许多个线程同时获取一定数量的许可(许可证)。当许可数量为1时,`Semaphore`就相当于一个互斥锁。多个线程可以同时获取(如果许可足够),只要它们在操作共享数据时不冲突。6.CAS解析思路:Java的原子类(如`AtomicInteger`)很多内部是利用了Compare-And-Swap(CAS)算法来实现的。CAS通过硬件指令保证原子性,即原子地比较并更新一个共享变量,如果当前值与预期值相同,则更新为新的值。7.`cachedThreadPool`解析思路:`Executors.newCachedThreadPool()`创建一个可缓存线程池,它的大小不固定,会根据需要创建新线程,但会尽可能重用之前构建的空闲线程。它使用`SynchronousQueue`作为工作队列。8.`unlock()`解析思路:在使用`ReentrantLock`时,必须显式地调用`lock()`方法来获取锁,同样,也必须显式地调用`unlock()`方法来释放锁。通常`unlock()`方法放在`try`代码块的最后,使用`finally`块来保证即使发生异常也能释放锁。9.不能保证复合操作的原子性解析思路:`volatile`关键字确保变量的可见性,即一个线程对`volatile`变量的修改对其他线程立即可见,并禁止对`volatile`变量读和写操作之间的指令重排序。但是,对于涉及`volatile`变量的复合操作(如`i++`,`i=i+1`,这其实包含读、算、写三个操作),`volatile`不能保证其原子性,这些操作仍需通过同步机制来保证。10.`join()`解析思路:当一个线程需要等待另一个线程完成其任务后才能继续执行时,可以使用`join()`方法。例如,主线程启动了几个工作线程,主线程需要等待所有工作线程都执行完毕后,再打印最终结果或进行后续处理,这时可以调用每个工作线程的`join()`方法。四、简答题1.请简述进程和线程的区别。答:进程是操作系统资源分配的基本单位,拥有独立的内存空间,是程序的一次执行过程。线程是CPU调度的基本单位,是进程内的一个执行流,多个线程共享所属进程的内存空间(代码段、数据段、堆等)。进程之间资源隔离,通信需要通过IPC;线程之间共享内存,通信更方便但需注意同步。创建和销毁进程的开销通常比线程大,线程切换的开销较小。一个进程可以包含多个线程。2.请解释什么是竞态条件,并举例说明。答:竞态条件是指多个线程访问共享数据时,程序的结果依赖于这些线程的执行顺序,导致结果不确定或错误的现象。它通常发生在以下情况:多个线程访问同一个共享变量,并且至少有一个线程对它进行写操作,且这些访问不是原子性的。例如,两个线程同时对同一个全局变量`count`进行自增操作:线程A执行`count=count+1`,线程B也执行`count=count+1`。这两个操作不是原子性的,可能执行顺序如下:A读取`count`(假设为1),B读取`count`(也为1),A计算得到2并写回`count`,B计算得到2并写回`count`。最终`count`只增加了1,而不是期望的2。3.请简述`synchronized`关键字和`ReentrantLock`的主要区别。答:`synchronized`是Java的内置锁机制,是隐式锁,使用简单方便。`ReentrantLock`是显式锁,需要手动获取和释放锁。主要区别包括:*功能:`ReentrantLock`提供更丰富的功能,如可指定公平/非公平锁、可中断的锁获取尝试(带超时)、可绑定多个`Condition`对象实现更灵活的线程通信。*性能:`ReentrantLock`在某些场景下(如公平锁、可中断)可能比`synchronized`有更好的性能,尤其是在高并发环境下。*透明度:`synchronized`是隐式的,与语法紧密耦合。`ReentrantLock`是显式的,需要显式调用`lock()`和`unlock()`方法。*底层实现:`synchronized`底层基于JVM的内置锁机制(Monitor),可能涉及锁升级。`ReentrantLock`基于抽象队列同步器(AQS)。4.请说明线程池有哪些好处?配置线程池时需要考虑哪些主要参数?答:线程池的好处包括:*线程复用:避免频繁创建和销毁线程的开销,提高系统资源利用率。*控制并发:限制同时运行的线程数量,防止系统资源(CPU、内存)被过度占用。*提高响应:任务提交给线程池通常比直接新建线程更快,提高系统吞吐量和响应速度。*隐藏细节:简化了并发编程的管理,开发者无需关注线程的创建、销毁和调度细节。配置线程池时需要考虑的主要参数:*核心线程数(CorePoolSize):线程池维护的最小线程数量。*最大线程数(MaximumPoolSize):线程池允许的最大线程数量。*工作队列(WorkQueue):用于存放等待执行的任务的队列,常用的有`LinkedBlockingQueue`,`ArrayBlockingQueue`,`SynchronousQueue`等。队列类型和大小影响任务等待和超时行为。*拒绝策略(RejectedExecutionPolicy):当队列满且线程数达到最大时,如何处理新任务,常见的有`AbortPolicy`(抛出异常)、`CallerRunsPolicy`(运行提交任务的线程)、`DiscardPolicy`(丢弃任务)、`DiscardOldestPolicy`(丢弃队列中最旧的任务)。*线程工厂(ThreadFactory):用于创建新线程的工厂,可以用于设置线程名、优先级、是否守护等。*饱和策略(饱和策略,通常指拒绝策略)。5.请解释什么是死锁,并至少列出三种避免死锁的方法。答:死锁是指两个或多个线程因互相持有对方需要的资源,并且都在等待对方释放资源,导致所有相关线程都永久阻塞,无法向前推进的状态。避免死锁的方法:*预防死锁:破坏死锁的四个必要条件之一。*破坏互斥条件:允许多个线程共享资源(通常不现实,适用于某些可共享资源,如读-写锁)。*破坏占有并等待条件:要求线程一次性申请所有需要的资源,或者禁止线程在持有资源的同时申请新资源。*破坏非抢占条件:允许操作系统强行剥夺某个线程的资源,重新分配。*破坏循环等待条件:对资源进行编号,要求线程只能按编号顺序申请资源。*避免死锁:动态检测并防止死锁的发生,通常通过银行家算法等。*检测与恢复:允许死锁发生,但系统能定期检测到死锁,并采取措施恢复(如杀死一些线程或强制释放资源)。五、编程题请编写一个Java程序,包含一个`BankAccount`类,该类有一个私有的`balance`变量表示余额。提供一个`deposit(intamount)`方法用于存款,和一个`withdraw(intamount)`方法用于取款。这两个方法都需要是线程安全的。在主方法中,创建一个`BankAccount`对象,并启动5个线程,其中3个线程向账户存入100元,2个线程从账户取出50元。最后打印出最终的账户余额。要求使用`synchronized`关键字实现线程安全。```javaimportjava.util.concurrent.locks.ReentrantLock;publicclassBankAccount{privateintbalance;//使用int,假设金额单位为元,且足够小privatefinalReentrantLocklock=newReentrantLock();//使用ReentrantLockpublicBankAccount(intinitialBalance){this.balance=initialBalance;}//线程安全的存款方法publicvoiddeposit(intamount){lock.lock();//获取锁try{if(amount>0){balance+=amount;}}finally{lock.unlock();//释放锁}}//线程安全的取款方法publicvoidwithdraw(intamount){lock.lock();//获取锁try{if(amount>0&&balance>=amount){balance-=amount;}}finally{lock.unlock();//释放锁}}//获取余额,此处也建议加锁以保证读操作的原子性或可见性publicintgetBalance(){lock.lock();//获取锁try{returnbalance;}finally{lock.unlock();//释放锁}}//存款线程任务staticclassDepositorimplementsRunnable{privateBankAccountaccount;privateintamount;privateintcount;publicDepositor(BankAccountaccount,intamount,intcount){this.account=account;this.amount=amount;this.count=count;}@Overridepublicvoidrun(){for(inti=0;i<count;i++){account.deposit(amount);//模拟存款耗时try{Thread.sleep(10);}catch(InterruptedExceptione){Thread.currentThread().interrupt();}}}}//取款线程任务staticclassWithdrawerimplementsRunnable{privateBankAccountaccount;privateintamount;privateintcount;publicWithdrawer(BankAccountaccount,intamount,intcount){this.account=account;this.amount=amount;

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论