练习13
- 利用多线程求解某范围能被3整除的数,每个线程负责1000范围:线程1找1-1000;线程2找1001-2000;线程3找2001-3000。编写程序,将每个线程找到的素数及时打印。
- 通过2个线程按顺序输出26个字母(不能重复)。
- 编写程序,模拟某电影院三个售票窗口同时出售电影票的过程。
第一题
package practice13;
class MyThread extends Thread{
int start,end;
public MyThread(int start,int end){
this.start=start;
this.end=end;
}
@Override
public void run() {
for(int i=start;i<=end;i++){
if(i%3==0) System.out.println(Thread.currentThread().getName()+':'+i);
}
}
}
public class Test1 {
public static void main(String[] args) {
Thread t1=new MyThread(1,1000);
Thread t2=new MyThread(1001,2000);
Thread t3=new MyThread(2001,3000);
t1.start();
t2.start();
t3.start();
}
}
第二题
package practice13;
class MyRunner implements Runnable {
private String string="abcdefghijklmnopqrstuvwxyz";
char[] ch= string.toCharArray();
Object obj=new Object();
private int i=0;
@Override
public void run() {
while(true){
synchronized(obj){
if(i>=26) break;
System.out.println(Thread.currentThread().getName()+':'+ch[i]);
i++;
}
try {
Thread.sleep(100);
} catch (Exception e) {
e.printStackTrace();
}
}
}
}
public class Test2 {
public static void main(String[] args) {
MyRunner r=new MyRunner();
Thread t1=new Thread(r,"线程1:");
Thread t2=new Thread(r,"线程2:");
t1.start();
t2.start();
}
}
第三题
package practice13;
import java.util.Scanner;
class MyRunner2 implements Runnable{
private int max;
int i=1;
Object obj= new Object();
public MyRunner2(int max){
this.max=max;
}
@Override
public void run() {
while(true){
synchronized(obj){
if(i>max) break;
System.out.println("窗口"+Thread.currentThread().getName()+"出售编号"+i+"电影票");
i++;
}
try {
Thread.sleep(10000);
} catch (Exception e) {
e.printStackTrace();
}
}
}
}
public class Test3 {
public static void main(String[] args) {
Scanner s=new Scanner(System.in);
System.out.println("请输入总票数");
int n=s.nextInt();
s.close();
MyRunner2 r=new MyRunner2(n);
Thread t1=new Thread(r,"1");
Thread t2=new Thread(r,"2");
Thread t3=new Thread(r,"3");
t1.start();
t2.start();
t3.start();
}
}