java,一个程序建立1000个线程,每一个线程加1到一个变量sum。
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;} ...