使用java的线程同步机制。
成都创新互联公司是一家集网站建设,朝阳县企业网站建设,朝阳县品牌网站建设,网站定制,朝阳县网站建设报价,网络营销,网络优化,朝阳县网站推广为一体的创新建站企业,帮助传统企业提升企业形象加强企业竞争力。可充分满足这一群体相比中小企业更为丰富、高端、多元的互联网需求。同时我们时刻保持专业、时尚、前沿,时刻以成就客户成长自我,坚持不断学习、思考、沉淀、净化自己,让我们为更多的企业打造出实用型网站。
现在存在两个线程a和b,伪代码如下:
在a的代码中:
b.start();//启动b线程
synchronized(b) b.wait();//a线程中采用同步,并进行等待
c.execute();
在b线程结束时调用synchronized(this) notify();
这样就可以达到b不结束,a线程就不会继续执行c。
注释:如果看不明白建议先学习一下java线程同步机制。
1、存在处以业务逻辑类,存在map,初始化。
2、存在线程池 最大200,ThreadFactory可以默认
3、单线程处理ip的类,构造方法包含是需参数Map,
4、外部循环 调用线程池,生成线程 传参 map 和当前循环次数
5、线程处理完ip后,将外部传来的循环次数做key,结果做value插入map,唤醒主线程判断map中的数量是否==需处理的ip的数量,选择跳出或继续等待。
② TestThread类
TestThread类是处理事务线程 即在标准输出设备上显示从 到
public class TestThread extends Thread {public void run(){ for (int i = ; i ; i++ ) {System out println(i); }} }
③ ThreadDiag类
ThreadDiag类用来显示 线程正在运行 提示框
import java awt *;import javax swing *;public class ThreadDiag extends Thread{ private Thread currentThread = null;//实际调用时就是TestThread事务处理线程 private String messages = ;//提示框的提示信息 private JFrame parentFrame = null;//提示框的父窗体 private JDialog clueDiag = null;// 线程正在运行 提示框 private Dimension dimensions = Toolkit getDefaultToolkit() getScreenSize(); private int width = dimensions width / height = ; private int left = top = ; public ThreadDiag(JFrame parentFrame Thread currentThread String messages) {this parentFrame = parentFrame;this currentThread = currentThread;this messages = messages;initDiag();//初始化提示框 } protected void initDiag(){clueDiag = new JDialog(parentFrame 正在执行 请等待 true);clueDiag setCursor(new Cursor(Cursor WAIT_CURSOR));JPanel testPanel = new JPanel();JLabel testLabel = new JLabel(messages);clueDiag getContentPane() add(testPanel);testPanel add(testLabel);(new DisposeDiag()) start();//启动关闭提示框线程 }public void run() {//显示提示框int left = (dimensions width width)/ ;int top = (dimensions height height)/ ;clueDiag setSize(new Dimension(width height));clueDiag setLocation(left top);clueDiag show(); }}
lishixinzhi/Article/program/Java/gj/201311/27677
有多种实现方式,下面列出两种。
第一种:实现Callable类,使用有返回值的线程,只有线程执行完成后才会返回结果。
import java.util.ArrayList;
import java.util.List;
import java.util.Random;
import java.util.concurrent.*;
public class Main {
// 初始化一个容量为10的线程池
static final ExecutorService pool = Executors.newFixedThreadPool(10);
public static void main(String[] args) throws ExecutionException, InterruptedException {
ListFutureString futures = new ArrayList();
for (int i = 0; i 3; i++) {
MyThread thread = new MyThread("线程" + i);
futures.add(pool.submit(thread));
}
for (FutureString future : futures) {
String name = future.get();
System.out.println(name + "执行完成...");
}
System.out.println("所有线程执行完成!");
}
}
class MyThread implements CallableString {
private String name;
public MyThread(String name) {
this.name = name;
}
@Override
public String call() throws Exception {
// TODO 执行业务
// 随机延迟,模拟线程耗时
Thread.sleep(1000 + new Random().nextInt(2000));
return name;
}
}
第二种:使用CountDownLatch实现线程计数,代码如下:
import java.util.Random;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
public class Main2 {
// 初始化一个容量为10的线程池
static final ExecutorService pool = Executors.newFixedThreadPool(10);
public static void main(String[] args) throws InterruptedException {
int threadCount = 3;
// 初始化CountDownLatch,用于线程计数
CountDownLatch latch = new CountDownLatch(threadCount);
for (int i = 0; i threadCount; i++) {
MyThread thread = new MyThread("线程" + i, latch);
pool.execute(thread);
}
// 阻塞当前线程,CountDownLatch计数减为0时表示所有线程都执行完毕,才会释放主线程的阻塞
latch.await();
System.out.println("所有线程执行完成!");
}
}
class MyThread implements Runnable {
private String name;
private CountDownLatch latch;
public MyThread(String name, CountDownLatch latch) {
this.name = name;
this.latch = latch;
}
@Override
public void run() {
// TODO 执行业务
// 随机延迟,模拟线程耗时
try {
Thread.sleep(1000 + new Random().nextInt(2000));
} catch (InterruptedException e) {
}
// 计数减一
latch.countDown();
System.out.println(name + "执行完毕...");
}
}
先调用
shutdown
在调用
isTerminated
例:
/*
* 采用线程池开启多个子线程,主线程等待所有的子线程执行完毕
*/
public static void moreThread() {
try {
int threadNum = 0;
for (int i = 0; i 10; i++) {
threadNum++;
final int currentThreadNum = threadNum;
exe.execute(new Runnable() {
@Override
public void run() {
try {
System.out.println("子线程[" + currentThreadNum + "]开启");
Thread.sleep(1000*10);
} catch (InterruptedException e) {
e.printStackTrace();
}finally{
System.out.println("子线程[" + currentThreadNum + "]结束");
}
}
});
}
System.out.println("已经开启所有的子线程");
exe.shutdown();
System.out.println("shutdown():启动一次顺序关闭,执行以前提交的任务,但不接受新任务。");
while(true){
if(exe.isTerminated()){
System.out.println("所有的子线程都结束了!");
break;
}
Thread.sleep(1000);
}
} catch (InterruptedException e) {
e.printStackTrace();
}finally{
System.out.println("主线程结束");
}
}
售后响应及时
7×24小时客服热线数据备份
更安全、更高效、更稳定价格公道精准
项目经理精准报价不弄虚作假合作无风险
重合同讲信誉,无效全额退款