public static void main(String[] args) {
在墨脱等地区,都构建了全面的区域性战略布局,加强发展的系统性、市场前瞻性、产品创新能力,以专注、极致的服务理念,为客户提供成都做网站、成都网站建设、成都外贸网站建设 网站设计制作按需制作,公司网站建设,企业网站建设,品牌网站建设,网络营销推广,外贸网站制作,墨脱网站建设费用合理。
for(Thread t:getThreads()){
t.start();
}
}
public static Thread[] getThreads(){
Thread[] thread = new Thread[10];
for(int i=0;i10;i++){
final Integer num = new Integer(i);
thread[i] = new Thread(new Runnable(){
public void run() {
int j=5;
while(j--0){
System.out.println("this is thread"+num);
}
}
});
}
return thread;
}
把对这个list的check行为放到一个多线程里面去做.这样当执行这个方法的时候.程序就会立刻返回,也就可以去处理其他事情了.线程会在后台执行.
不要把每个check都用一个线程,这样的并发问题,是非常复杂.
public void method(){
Thread t = new Thread() {
@Override
public void run() {
//dosomething
//线程在后台执行你想执行的东西
}
};
t.start();
//该方法执行后,立刻返回,让程序得意执行其他操作
}
这边我写了一个例子,两个线程同时获取随机数,当获取的值为68的时候则停止所有进程。
这是目录结构:MyThreadOne和MyThreadTwo是两个线程,TestMain是主函数,MyThread继承Thread类。
MyThread.java
package com.xsx.test;
public class MyThread extends Thread {
public void stopThread() {}
}
MyThreadOne.java
package com.xsx.test;
import java.util.Random;
public class MyThreadOne extends MyThread{
private boolean isOK = true;
Random random = new Random();//演示
public void stopThread() {
this.isOK = false;
}
@Override
public void run() {
while(isOK) {
int x = random.nextInt(10000);
System.out.println("Thread One: " + x);
if(x == 68) {
TestMain.stopAll();
System.out.println("My Value is " + x);
break;
}
}
//这边你结合自己的逻辑来写,总之,是通过isOK来控制线程的
}
}
MyThreadTwo.java
package com.xsx.test;
import java.util.Random;
public class MyThreadTwo extends MyThread {
private boolean isOK = true;
Random random = new Random();//演示
public void stopThread() {
this.isOK = false;
}
@Override
public void run() {
while(isOK) {
int x = random.nextInt(10000);
System.out.println("Thread Two: " + x);
if(x == 68) {
TestMain.stopAll();
System.out.println("My Value is " + x);
break;
}
}
}
}
TestMain.java
package com.xsx.test;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
public class TestMain {
public static MapString, MyThread threadPool = new HashMapString, MyThread();//定义一个线程池
/***
* 终止所有线程
*/
public static void stopAll() {
IteratorMyThread threads = threadPool.values().iterator();
while(threads.hasNext()) {
threads.next().stopThread();
}
threadPool.clear();
}
public static void main(String[] args) {
//实例化两个线程获取到随机数为68时就停止进程,并输出
MyThread thread1 = new MyThreadOne();//实例化线程1
MyThread thread2 = new MyThreadTwo();//实例化线程2
threadPool.put("thread1", thread1);//将线程1放入线程池中
threadPool.put("thread2", thread2);//将线程2放入线程池中
thread1.start();//运行
thread2.start();
}
}
项目已经打包上传
Java 给多线程编程提供了内置的支持。 一条线程指的是进程中一个单一顺序的控制流,一个进程中可以并发多个线程,每条线程并行执行不同的任务。
新建状态:
使用 new 关键字和 Thread 类或其子类建立一个线程对象后,该线程对象就处于新建状态。它保持这个状态直到程序 start() 这个线程。
就绪状态:
当线程对象调用了start()方法之后,该线程就进入就绪状态。就绪状态的线程处于就绪队列中,要等待JVM里线程调度器的调度。
运行状态:
如果就绪状态的线程获取 CPU 资源,就可以执行 run(),此时线程便处于运行状态。处于运行状态的线程最为复杂,它可以变为阻塞状态、就绪状态和死亡状态。
阻塞状态:
如果一个线程执行了sleep(睡眠)、suspend(挂起)等方法,失去所占用资源之后,该线程就从运行状态进入阻塞状态。在睡眠时间已到或获得设备资源后可以重新进入就绪状态。可以分为三种:
等待阻塞:运行状态中的线程执行 wait() 方法,使线程进入到等待阻塞状态。
同步阻塞:线程在获取 synchronized 同步锁失败(因为同步锁被其他线程占用)。
其他阻塞:通过调用线程的 sleep() 或 join() 发出了 I/O 请求时,线程就会进入到阻塞状态。当sleep() 状态超时,join() 等待线程终止或超时,或者 I/O 处理完毕,线程重新转入就绪状态。
死亡状态:
一个运行状态的线程完成任务或者其他终止条件发生时,该线程就切换到终止状态。