java,一个程序建立1000个线程,每一个线程加1到一个变量sum。

JAVA编程 题目:一个启动十个线程的程序,每一线程给一个初值为0的变量sum加1。~

public class TestThread {

public static int sum = 0;

class Add implements Runnable {

@Override
public void run() {
sum += 1;
System.out.println(sum);
}

}

public static void main(String[] args) {
for (int i = 0; i < 10; i++) {
new Thread(new TestThread().new Add()).start();
}
}

}

我循环了10次不就是10个线程都开启了吗?

// 你看看吧。。。 不懂的在问我


public class Test implements Runnable {
public static void main(String[] args) {
for (int i = 0; i < 100; i++) { // 创建100个线程
Test line = new Test();
Thread t = new Thread(line, i + "");
t.start();
}
}

public void run() { // 线程
for (int i = 0; i < 10; i++) { //每条线程输出的次数 如果你是10次 100个线程,如果同步,sum 应该是1000
try {
sum.list();
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}

}

class sum {
static Integer sum = 0;

public synchronized static void list() { //synchronized 代表线程同步, 如果去掉.就会不同步
sum++;
System.out.println("我是线程" + Thread.currentThread().getName()
+ " sum--------->" + sum);
}

}

1、程序建立1000个线程,有可能造成系统创建大量线程而导致消耗完系统内存,还会增加创建和销毁线程上所花的时间以及系统资源的开销 

2、在创建线程数多的情况下,可以考虑使用线程池

以下是Java自带的几种线程池:

(1)、newFixedThreadPool 创建一个指定工作线程数量的线程池。

每当提交一个任务就创建一个工作线程,如果工作线程数量达到线程池初始的最大数,则将提交的任务存入到池队列中。

(2)、newCachedThreadPool 创建一个可缓存的线程池。

这种类型的线程池特点是:

1).工作线程的创建数量几乎没有限制(其实也有限制的,数目为Interger. MAX_VALUE), 这样可灵活的往线程池中添加线程。

2).如果长时间没有往线程池中提交任务,即如果工作线程空闲了指定的时间(默认为1分钟),则该工作线程将自动终止。终止后,如果你又提交了新的任务,则线程池重新创建一个工作线程。

(3)、newSingleThreadExecutor 创建一个单线程化的Executor,即只创建唯一的工作者线程来执行任务,如果这个线程异常结束,会有另一个取代它,保证顺序执行(我觉得这点是它的特色)。

单工作线程最大的特点是可保证顺序地执行各个任务,并且在任意给定的时间不会有多个线程是活动的 。

(4)、newScheduleThreadPool 创建一个定长的线程池,而且支持定时的以及周期性的任务执行,类似于Timer。

3、示例代码

package test;  
import java.util.concurrent.ExecutorService;  
import java.util.concurrent.Executors;  
public class ThreadPoolExecutorTest {  
 public static void main(String[] args) {  
  ExecutorService cachedThreadPool = Executors.newCachedThreadPool();  
  for (int i = 0; i < 1000; i++) {  
   
   cachedThreadPool.execute(new Runnable() {  
    public void run() {  
         //在这里执行你需要的功能
    }  
   });  
  }  
 }  
}


package com.company;
class Adder {
    private int sum;
    public Adder() { sum = 0; }
    public void addOne() { sum += 1; }
    public int getSum() { return sum; }
}
class AddThread extends Thread {
    private Adder adder;
    public AddThread(Adder a) {
        adder = a;
    }
    public void run() {
        synchronized (adder) {
            adder.addOne();
        }
    }
}
public class Main {
    public static void main(String[] args) {
        Adder a = new Adder();
        Thread[] threads = new Thread[1000];
        for (int i = 0; i < 1000; i++) {
            threads[i] = new AddThread(a);
        }
        for (int i = 0; i < 1000; i++) {
            threads[i].start();
        }
        try {
            for (int i = 0; i < 1000; i++) {
                threads[i].join();
            }
        } catch (InterruptedException e) {
        }
        System.out.println("Sum = " + a.getSum());
    }
}


import java.util.ArrayList;
import java.util.List;
import java.io.IOException;
class SumObj{
int sum;
public SumObj(){
sum=0;
}
public synchronized void addNumToSum(int n){
sum+=n;
}
public synchronized int getSum(){
return this.sum;
}
}
class AddThread implements Runnable{
private SumObj sumObj;

public AddThread(SumObj sumObj){
this.sumObj=sumObj;
}

@Override
public void run() {
this.sumObj.addNumToSum(1);
System.out.println(Thread.currentThread().getName()+" finish add number!");
}
}
public class Test {

public static void main(String[] args) throws IOException {
List<Runnable>threads=new ArrayList<Runnable>();
SumObj sumObj=new SumObj();
for(int i=0;i<1000;i++){
threads.add(new AddThread(sumObj));
}
//开启线程
for(Runnable r:threads){
new Thread(r).start();
}
while(sumObj.getSum()<1000){
try {
Thread.currentThread().sleep(1);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
System.out.println("sum : "+sumObj.getSum());

}

}


那就new 1000个线程呗 。。。

编写一个JAVA 程序,把100元换成50、20、10的纸卑。有多手v种方法?_百 ...
答:} else if(change>=20){ twenty++;change-=20;} else if(change>=10){ ten++;change-=10;} } System.out.println("fifty: "+fifty+"\ntwenty:"+twenty+"\nten: "+ten);System.out.println("零钱为:"+change);} public static void main(String [] args){ change(100);} } ...

编写一个JAVA程序,输出100~200之间不能被2和5整除的数
答:public class test { public static void main(String args[]) { // 输出5行 for (int i = 0; i < 5; i++) { // 输出4列 for (int j = 1; j < 5; j++) { // 当i==0时输出标题栏 if (i == 0) { // 过滤j=1的时候输出1*N的这种情况 if (j - 1 == 0)// ...

Java100行以上源代码,至少五个class以及一个interface,可以简单点?
答:下面是一个可能的Java源代码,它包含了一个接口(Shape)和五个类(Circle, Rectangle, Triangle, Square 和 Main)。它的功能是计算不同形状的面积和周长。//定义一个接口Shape,有两个抽象方法:getArea()和getPerimeter()interface Shape { double getArea(); double getPerimeter();}//定义一...

用java编一个程序,求100以内所有能被3整除或被7整除的数,并把结果写入...
答://保存数字个数for (int i = 1; i < 100; i++) {if(i%3==0||i%7==0){//能被3或者7整除index++;bw.write(String.valueOf(i)+"\t");if(index%5==0){ //每5个数字,换一行bw.newLine();//换行}}}bw.close();//关闭流System.out.println("结果保存到"+FILE_PATH+"...

编写一个Java应用程序,实现如下功能: 随机分配给客户一个1~100之间的...
答:{ new Gui("猜数字游戏"); } } class Gui extends Frame implements ActionListener { static int number;static int guessnumber;static TextField tx;static Label lb3,lb1,lb2;static Button bt3,bt1,bt2;Gui(String s){ super(s);lb1=new Label("单击该按钮可以产生一个0-100之间的随机...

java 从1-999之间产生100个不重复的随机数。
答:但是有点不同,你需要将遇到相同的数,你需要重新在生成一个随机数,直到不同在插于进去,具体做法是外层是一个for循环,100次,内层用do while语句,将生成的随机数插于,插于排序可以参考数据接口,是种很简单的,我不喜欢直接帮你们写程序,我想帮你讲了这些,你一定可以实现。

java编写游戏程序,完成猜数字游戏,数字是由计算机随机产生的100以内...
答:import java.util.Scanner;public class Guess{ public static void main(String[] args){ int i,r,count=0;boolean flag=false;Scanner input=new Scanner(System.in);do{ System.out.print("我猜这个数是:");i=input.nextInt();r=(int)(Math.random() * 100);if(i==r){ System.out....

编写一个Java的应用程序,输出自己的名字100次,例如:李三1,李三2
答:其实现如下所写:public class OutName { public static void main(String [] args){ for(i=1;i<=100;i++){ System.out.println("李三"+i);} } } 他没定义i,运行不了 这个行 public class q1 { public static void main(String [] args) { for(int i = 1; i <= 100; i ++...

编写一个java程序将100,101,102,103,104,105这6个数以数组的形式写入到...
答:import java.io.FileWriter;import java.io.IOException;import java.util.Date;import java.util.Scanner;public class Test { public static void main(String[] args) { // 100,101,102,103,104,105 // 你问的不明不白,这6个数是一个字符串还是说是要求一个一个输入然后保存 /...

编写一个java程序,在程序中从键盘输入一个范围在50~100的整数。若不正...
答:Scanner scanner =new Scanner(System.in);boolean f=true;while(f){ System.out.print("请输入一个整数(50-100):");int k=scanner.nextInt();if(k<50 || k>100) System.out.println("输入错误!重新输入。");else f=false;} ...

IT评价网,数码产品家用电器电子设备等点评来自于网友使用感受交流,不对其内容作任何保证

联系反馈
Copyright© IT评价网