当前位置:编程学习 > JAVA >>

java 循环 多线程问题.

--------------------编程问答-------------------- --------------------编程问答-------------------- 我昨天看了类似的问题 你可以网上下载孙鑫的java视频教程 应该是第7张光盘 里面有一个跟这个类似的程序
class TicketsSystem
{
public static void main(String[] args)
{
SellThread st=new SellThread();

new Thread(st).start();
try
{
Thread.sleep(1);
}
catch(Exception e)
{
e.printStackTrace();
}
st.b=true;
new Thread(st).start();
//new Thread(st).start();
//new Thread(st).start();
}
}

class SellThread implements Runnable
{
int tickets=100;
Object obj=new Object();
boolean b=false;
public void run()
{
if(b==false)
{
while(true)
sell();
}
else
{
while(true)
{
synchronized(obj)
{
try
{
Thread.sleep(10);
}
catch(Exception e)
{
e.printStackTrace();
}
synchronized(this)
{
if(tickets>0)
{

System.out.println("obj:"+Thread.currentThread().getName()+
" sell tickets:"+tickets);
tickets--;
}
}
}
}
}
}
public synchronized void sell()
{
synchronized(obj)
{
if(tickets>0)
{
try
{
Thread.sleep(10);
}
catch(Exception e)
{
e.printStackTrace();
}
System.out.println("sell():"+Thread.currentThread().getName()+
" sell tickets:"+tickets);
tickets--;
}
}
}
} --------------------编程问答--------------------

    static int k = 0;
    final static int kmax = 1000000;

    synchronized static int getK() {
        if (k < kmax) {
            int bk = k;
            k++;
            return bk;
        }
        return -1;
    }

    public static void main(String[] args) {
        int threadMax = 10;
        for (int j = 0; j < threadMax; j++) {
            final Thread thr = new Thread("tname:" + j) {

                @Override
                public void run() {
                    int i;
                    while ((i = getK()) != -1) {
                        System.out.println(Thread.currentThread() + "\tvalue:" + i);
                        try {
                            Thread.sleep(0);
                        } catch (InterruptedException ex) {
                        }
                    }
                }
            };
            thr.setDaemon(true);
            thr.start();
        }
        Scanner sc = new Scanner(System.in);
        sc.nextLine();
    }
--------------------编程问答--------------------

//方法很多,我采取最简单的方法。还有1000000特别大,如果屏幕显示不完,打印到文件才能看出结果,或者把它的值变小
import java.util.concurrent.*;
public class Counter implements Runnable {
    public static volatile int i = 0;
    private static final int SIZE = 1000;//1000000;太

    public static synchronized void next() {
if (i < SIZE)
    System.out.println("value:" + i++);
    }

    public void run() {
while (i < 10000) 
    next();

    }

    public static void main(String[] args) throws Exception {
ExecutorService exec = Executors.newCachedThreadPool();
for (int i = 0; i < 20; i++) {
    exec.execute(new Counter());
}
    }
}


--------------------编程问答-------------------- main方法中 我设置的20 表示有20个线程同时运行 --------------------编程问答--------------------
package com.j913;

public class Test {
public static void main(String[] args) {
Print p = new Print();
Thread t1 = new Thread(p);
Thread t2 = new Thread(p);
Thread t3 = new Thread(p);
t1.start();
t2.start();
t3.start();
}
}

class Print implements Runnable {
private int i;
@Override
public void run() {
synchronized (this) {
for (; i < 10000; i++) {
System.out.println("thread:" + Thread.currentThread().getName() + " value:" + i);
}
}
}

}


是这个意思吗,几个线程合作打印出结果。 --------------------编程问答-------------------- 拆分成几个任务,每个任务执行一部分就行了

import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;

public class TestMultiThread {

public static void main(String[] args) throws InterruptedException, ExecutionException {
int amount = 10000;
int part = 1000;
int start = 0;
int end = 0;

ExecutorService threadPool = Executors.newCachedThreadPool();
Collection<Callable<String>> tasks = new ArrayList<Callable<String>>();
for(int i = 1; i <= amount/part; i++){
end = start + part;
tasks.add(new DisplayValue(start, end));
start = end;
}

List<Future<String>> results = threadPool.invokeAll(tasks);
threadPool.shutdown();

for(Future<String> result : results){
System.out.println(result.get());
}
}

}

class DisplayValue implements Callable<String>{

private int start = 0;
private int end = 0;
StringBuilder sb = new StringBuilder();

DisplayValue(int start, int end){
this.start = start;
this.end = end;
}

public String call() {
for(int i = start; i < end; i++){
// sb.append("value : ");
sb.append(i);
sb.append(" ");
if(i > start && i % 100 == 0){
sb.append("\n");
}
}
sb.append("\n");
return sb.toString();
}
}
--------------------编程问答-------------------- 如果不需要按顺序执行的话,可以每个线程打印某个位置的数,
如第一个线程打印0,5,10...
第二个打印1,6,11...
第三个打印2,7,12...
就是 起始位置递增线程总数(例子以5个线程为例)

如果需要连续,可以把数据分段,
如第一个线程打印0-200000
第二个打印200001-400000
...
就是按1000000除以线程总数平分

for example
public class Test {
    public static void main(String[] args) {
        final int threadCount = 5;
        Thread[] t = new Thread[threadCount];
        final int maxLoop = 1000000;
        for (int i=0; i<threadCount; i++) {
            final int j = i;
            t[i] = new Thread() {
                public void run() {
                    for (int i=j; i<maxLoop; i+=threadCount) {
                        System.out.println("value:" + i);
                    }
                }
            };
            t[i].start();
        }
    }
}
--------------------编程问答-------------------- 楼上的代码很全了。 --------------------编程问答-------------------- 初学Java,不知写的有没有问题。

public class ThreadFor
{
public static void main(String [] args)
{
/*
for(int i=0;i<10000;i++)
{
System.out.println(i)
}
*/
SportFor s=new SportFor();
Thread t0=new Thread(s);
Thread t1=new Thread(s);
Thread t2=new Thread(s);
Thread t3=new Thread(s);
t0.start();
t1.start();
t2.start();
t3.start();
}
}

class SportFor implements Runnable
{
int i=0;

public void  run()
{

while(true)
{
synchronized(this)
{

if(i<=10000)
getNext();
else
return;
}

try
{
Thread.sleep(100);
}
catch(Exception ex)
{
System.out.println(ex.getMessage());
}

}

}

void getNext()
{
System.out.println(Thread.currentThread().getName()+"  "+i++);
}
} --------------------编程问答--------------------

public class ThreadFor
{
public static void main(String [] args)
{
/*
for(int i=0;i<10000;i++)
{
System.out.println(i)
}
*/
SportFor s=new SportFor();
Thread t0=new Thread(s);
Thread t1=new Thread(s);
Thread t2=new Thread(s);
Thread t3=new Thread(s);
t0.start();
t1.start();
t2.start();
t3.start();
}
}

class SportFor implements Runnable
{
int i=0;

public void  run()
{

while(true)
{
synchronized(this)
{

if(i<=10000)
getNext();
else
return;
}

try
{
Thread.sleep(100);
}
catch(Exception ex)
{
System.out.println(ex.getMessage());
}

}

}

void getNext()
{
System.out.println(Thread.currentThread().getName()+"  "+i++);
}
}
--------------------编程问答-------------------- 为什么要分不同线程打呢? --------------------编程问答-------------------- 这个根本就没有多个线程打的需要。

LZ也许是想写个多线程程序玩吧。

--------------------编程问答-------------------- 学习中............. --------------------编程问答-------------------- 各种线程 --------------------编程问答--------------------  - -|| 这都什么跟什么啊。。
补充:Java ,  Java SE
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,