1、编写一个有两个线程的程序,第一个线程用来计算2~100000之间的素数的个数,第二个线程用来计算100000~200000之间的素数的个数,最后输出结果。
public static void main(String[] args) throws InterruptedException {
Thread t1 = new Thread(){
@Override
public void run() {
int index = 0;
for (int i = 2; i <= 100000; i++) {
boolean a = true;
for (int j = 2; j<=Math.sqrt(i); j++) {
if (i % j == 0) {
a= false;
}
if (a==true){
index++;
a=false;
}
}
}System.out.println("2~100000之间的素数的个数为:"+index);
}
};
Thread t2 = new Thread(){
@Override
public void run() {
int index = 0;
for (int i = 100000; i <= 200000; i++) {
boolean a = true;
for (int j = 2; j <=Math.sqrt(i); j++) {
if (i % j == 0) {
a = false;
}
if (a){
index++;
a=false;
}
}
}
System.out.println("100000~200000之间的素数的个数为:"+index);
}
};
t1.start();
t2.start();
t1.join();
t2.join();
System.out.println(Thread.currentThread().getName());
}
2、模拟多线程并发问题,并解决(方式越多越好)
模拟两个人(两个线程),同时在桌子上拿豆子,考虑并发出错情况
public class Jindou {
private int num;
public Jindou(int num) {
this.num = num;
}
public void catchBead(){
if (num == 0){
throw new RuntimeException("豆子没了");
}
num--;
}
public int getNum() {
return num;
}
public void setNum(int num) {
this.num = num;
}
}
class JindouTest{
public static void main(String[] args) {
Jindou jindou = new Jindou(300);
Thread t1 = new Thread(){
@Override
public void run() {
while (true){
jindou.catchBead();
int num = jindou.getNum();
System.out.println(Thread.currentThread().getName()+":"+num);
}
}
};
Thread t2 = new Thread(){
@Override
public void run() {
while (true){
jindou.catchBead();
int num = jindou.getNum();
System.out.println(Thread.currentThread().getName()+":"+num);
}
}
};
t1.setName("狗梦");
t2.setName("A1");
t1.start();
t2.start();
}
}
public class Jindou {
private int num;
public Jindou(int num) {
this.num = num;
}
public void catchBead(int num){
this.num = num;
}
public int getNum() {
return num;
}
public void setNum(int num) {
this.num = num;
}
}
class JindouTest{
public static void main(String[] args) {
Jindou jindou = new Jindou(300);
Thread t1 = new Thread(){
@Override
public void run() {
synchronized (Jindou.class){
Thread.yield();
int num = jindou.getNum();
num -= 20;
jindou.catchBead(num);
System.out.println(Thread.currentThread().getName()+":"+num);
}
}
};
Thread t2 = new Thread(){
@Override
public void run() {
synchronized (Jindou.class){
Thread.yield();
int num = jindou.getNum();
num -= 20;
jindou.catchBead(num);
System.out.println(Thread.currentThread().getName()+":"+num);
}
}
};
t1.setName("狗梦");
t2.setName("A1");
t1.start();
t2.start();
}
}