ThreadPoolExecutor添加线程不执行,为什么 5C

import com.google.common.util.concurrent.ThreadFactoryBuilder;

import java.util.concurrent.*;

public class MyBlockingQueue implements Runnable {

BlockingQueue<String> queue;

private int index;

public MyBlockingQueue(BlockingQueue<String> queue, int index) {
    this.queue = queue;
    this.index = index;
}

@Override
public void run() {
    try {
        queue.put(String.valueOf(this.index));
        System.out.println("{" + this.index + "} in queue!");
    } catch (Exception e) {
        e.printStackTrace();
    }
}

public static void main(String args[]) {
    BlockingQueue<String> queue = new LinkedBlockingQueue<String>(3);

    ThreadFactory factory = new ThreadFactoryBuilder().setNameFormat("aaa-%s").build();
    ExecutorService pool = new ThreadPoolExecutor(5, 200, 0L, TimeUnit.MILLISECONDS,
            new LinkedBlockingQueue<>(1024), factory, new ThreadPoolExecutor.AbortPolicy());

    for (int i = 0; i < 10; i++) {
        pool.submit(new MyBlockingQueue(queue, i));
    }

  //为什么这里的线程不执行呢?
    pool.submit(() -> {
        try {
            while (true) {
                System.out.println("=======" + queue.size());
                if (queue.isEmpty()) {
                    break;
                }
                String str = queue.take();
                System.out.println(str + " has take!");
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    });

    pool.shutdown();
}

}

1个回答

首先想说一下,其中的问题,阻塞队列和工厂模式OK,
在创建线程池的时候并不建议使用ExecutorService 中的构造函数,而是使用Executors里面提供的四种静态方法,很多的参数配置已经写好。

其次,给线程池submit的应该是线程,而不是阻塞队列,你那里submit的是阻塞队列噢,循环体里面你可以写一个自己的类
比如(class MyThread extends Thread),再写一个print,sleep一下,就可以看到线程池的执行啦。

https://blog.csdn.net/whandwho/article/details/82931798 这个博客下方第八点

whandwho
大川里的小川人 回复adongsha: 是我没有说清楚哇?最后的那一条,已经说清楚了嘛,有什么问题你再问嘛。
12 个月之前 回复
whandwho
大川里的小川人 回复adongsha: 我重新完整看了一遍你的代码。我帮你理一下你的思路,首先,你实现了runnable接口新建了一个线程类,线程类内部定义了index和一个string的阻塞队列。 其次,在main函数里面,你内部定义了一个String的阻塞队列,而针对线程池的阻塞队列,类型应该是线程类。 最后,你submit的是你自己定义的线程类,OK,然后你讲阻塞队列里面的取出来,取出来的是定义为String的阻塞队列内部内容。但是你实例化的是自己定义的实现runnable接口线程类MyBlockdeQuene.
12 个月之前 回复
whandwho
大川里的小川人 回复adongsha: 但是你submit的是队列,就算你这样是参考的阿里规范,按照你的意思,我submit的是阻塞队列,OK,没有问题。接着那么阻塞队列里面存放的应该是 Thread 线程,而不是 String。 所以就算你submit了一个队列,但是你队列里面存放的也不是线程Thread。
12 个月之前 回复
whandwho
大川里的小川人 接着那么阻塞队列里面存放的应该是 Thread 线程,而不是 String。
12 个月之前 回复
whandwho
大川里的小川人 回复adongsha: 但是你submit的是队列,就算你这样是参考的阿里规范,按照你的意思,我submit的是阻塞队列,OK,没有问题。
12 个月之前 回复
adongsha
adongsha 这种方式的写法是参考阿里java规范的写法,你提倡的那种写法,阿里规范是不建议的哦
12 个月之前 回复
Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
其他相关推荐
ThreadPoolExecutor ,任务超时不执行
线程池开启很多线程执行任务,要求每个任务必须按时完成,否则视为超时,需马上停止该任务。请教各位,利用java5线程池如何实现?
此线程为什么不执行?
以下是我的源代码:可是线程执行体不执行请高手给我看看unit ParseData;rnrninterfacernrnusesrn Classes,comctrls;rnrntypern TParseDataThread = class(TThread)rn privatern ForTranXH:array[1..4] of byte;rnrn procedure TransformXH(); //将经过校验并且准确的遥信字转换为十六进制以备显示rn Private declarations rn protectedrn procedure Execute; override;rn publishedrn constructor CreateIt(NoParseYX:array of byte);rn publicrn Strhex:string;rnrn end;rnrnimplementationrnusesrn windows,Port;rnrnrnrnrn Important: Methods and properties of objects in visual components can only bern used in a method called using Synchronize, for example,rnrn Synchronize(UpdateCaption);rnrn and UpdateCaption could look like,rnrn procedure TParseDataThread.UpdateCaption;rn beginrn Form1.Caption := 'Updated in a thread';rn end; rnrn TParseDataThread rnconstructor TParseDataThread.CreateIt(NoParseYX:array of byte);rnvarrn i:integer;rnbeginrn inherited Create(true);rn FreeOnTerminate:=true;rn for i:=1 to 4 dorn ForTranXH[i]:=NoParseYX[i-1];rnrnend;rnrnrnprocedure TParseDataThread.Execute;rnvarrn CheckPlusValue:integer;rnbeginrn Place thread code here rn CheckPlusValue:=ForTranXH[1] xor ForTranXH[2] xor ForTranXH[3] xor ForTranXH[4];rn if CheckPlusValue=255 thenrn TransformXH();rnrnend;rnprocedure TParseDataThread.TransformXH();rnvarrn n:integer;rn intValue:integer;rn intHighHex:Integer;rn intLowHex:Integer;rnrnbeginrn strhex:='';rn For n:= 1 To 4 dorn beginrn intValue:= ForTranXH[n];rn intHighHex:= intValue div 16;rn intLowHex:= intValue - intHighHex * 16;rn If intHighHex < 10 Thenrn intHighHex:= intHighHex + 48rn Elsern intHighHex:= intHighHex + 55;rn If intLowHex < 10 Thenrn intLowHex:= intLowHex + 48rn Elsern intLowHex:= intLowHex + 55;rn strHex:= strHex+' '+ Chr(intHighHex)+Chr(intLowHex)+ ' ';rnrn end;rn postmessage(form1.Handle, WM_ThreadLiraN,0,0);rnrnend;rnrnrnend.rn
为什么第一个线程不执行?
for(int i=1;i<10;i++)rn rn rn void* pInt =(void*)(&i);rn rn CMyThreadData *pThreadData = new CMyThreadData;rn pThreadData->m_pData = pInt;rn pThreadData->m_iDataLength = sizeof(int); rn pThreadData->m_iTypeID = 1;rn CWinThread* pThread = AfxBeginThread(ThreadFunction,pThreadData,THREAD_PRIORITY_NORMAL,0,CREATE_SUSPENDED);rn rn pThread->m_bAutoDelete = FALSE;rn pThread->ResumeThread();rn rn rnrn我跟踪调试了一下,发现从第二次循环开始才进入到线程函数ThreadFunction中,这是何原因,如何解决?
这个线程为什么不执行
import java.awt.*;rnimport java.applet.*;rnimport java.lang.*;rnrnpublic class ThreadText extends Applet rn rn public static int i;rnrn public void start()rn rnrn OneThread thread=new OneThread();rn thread.start(); rn rnrnrn public void paint(Graphics g)rn rn Font f=new Font("Fixedsys",Font.BOLD,36);rn g.setFont(f);rn g.drawString("abc",i,50);rn rn rnrnclass OneThread extends Threadrnrn OneThread()rn super();rn rn public void run()rn rn ThreadText text=new ThreadText();rn int j;rn tryrn rn dorn // text.paint(Graphics g);rn text.repaint();rn if(text.i>10000)rn text.i=0;rn elsern text.i=text.i+100;rnrn j=text.i%800;rn Thread.sleep(1000);rn while(j<=800);rn rn catch(InterruptedException e)rn rn
为什么工作者线程不执行。
刚接触多线程,所以自己写了个很简单的。可是不知道为什么线程函数不运行、rnrnvoid CTestTheardDlg::OnOK() rnrn // TODO: Add extra validation herern UpdateData(TRUE);rnrn nContinue=0;rn Thread=AfxBeginThread(ThreadFunc,&nContinue);rn nContinue=1;rn CDialog::OnOK();rnrnrnUINT ThreadFunc (LPVOID pParam)rnrnint i=0;rn while (i<100)rn rn //work work workrn i++;rn wsprintf(szOut, "szOut=%ld", i);rn ::AfxMessageBox(szOut);rnrn rn return 0;rn rnrn没有编译错误,我在VC知识库里面下了个类似的修改以后就能输出1-100,可是在自己的这里就是不行,不知道为什么请高手指教
为什么我的线程不执行?
把帮助里的UsingTServiceThread的一抹一样考到delphi里,怎么把服务装上去就是没动静,已经/install和启动服务了,谁能看看我缺了哪?或说那个帮助文件里还有什么没说清楚?
线程 destroy 为什么不执行
线程类如下:typern TThreadProc = Procedure of object;rnrn TDealThread = class(TThread)rn privatern FThreadProc : TThreadProc;rn FBeforeDestory : TThreadProc;rn protectedrn procedure Execute ;Override;rn publicrn constructor Create(ThreadProc : TThreadProc);OverLoad;rn destructor Destroy;Override;rnrn property OnBeforeDestory: TThreadProc read FBeforeDestory write FBeforeDestory;rn end;rnrnimplementationrnrnuses Forms,windows;rnrnconstructor TDealThread.Create(ThreadProc : TThreadProc);rnbeginrn FThreadProc:= ThreadProc;rn rn Inherited Create(TRUE);rnend;rnrndestructor TDealThread.Destroy;rnbeginrn OnBeforeDestory;rn Application.MessageBox('文件已经关闭!','提示',mb_OK + MB_ICONERROR);rn rn Inherited Destroy;rnend;rnrnprocedure TDealThread.Execute;rnbeginrn FThreadProc;rnrn Terminate; rnend;rn
线程的析构函数为什么不执行
__fastcall CCLTP::CCLTP(bool CreateSuspended,AnsiString FileName,int Method)rn : TThread(CreateSuspended)rnrn this->FileName=FileName;rn this->Method=Method;rn this->strFileName=ExtractFileName(FileName);rn this->strFilePath=ExtractFilePath(FileName);rn aFileName="";rn bFileName="";rn g_pCLInfo=new CLInfo;rn TMultiReadExclusiveWriteSynchronizer *section=new TMultiReadExclusiveWriteSynchronizer();rn section->BeginWrite();rn CLInfoCount++;rn section->EndWrite();rn delete section;rn g_pCLInfo->HPHM="-" ;rn g_pCLInfo->HPZL="" ;rn g_pCLInfo->HPYS="无" ;rn g_pCLInfo->WFXW="" ;rn g_pCLInfo->DYCD="";rn g_pCLInfo->XHDZT="-" ;rn g_pCLInfo->SRSC="-" ;rn g_pCLInfo->SFWZ="-";rnrn__fastcall CCLTP::~CCLTP()rnrn delete g_pCLInfo;rn TMultiReadExclusiveWriteSynchronizer *section=new TMultiReadExclusiveWriteSynchronizer();rn section->BeginWrite();rn CLInfoCount--;rn section->EndWrite();rn delete section;rnrnrnrn当执行完Execute后,为什么不会进入~CCLTP()?rn谢谢
创建一个线程,为什么不执行?
在VC6环境下编程,调试的时候选择 DEBUG->THREADS,并没有发现新创建的线程,很郁闷rn高手帮个忙,看看是什么问题rn主要代码如下。rnrnrn// A.h 文件rnclass Arn rn /*...*/rnpublic:rn creat(); // 用来创建一个线程rn /*...*/rnprivate:rn SOCKET s; // 传递给线程的参数rn;rnrn// A.cpp 文件rn#include "A.h"rn/*...*/rnrnDWORD ThreadFun(LPVOID lpParam); // 线程调用的函数rnrnA::create()rn rn DWORD dwThreadId;rn HANDLE hThread;rn hThread = CreateThread(NULL, 0, rn reinterpret_cast(ThreadFun), rn &s, 0, &dwThreadId);rnrnrnDWORD ThreadFun(LPVOID lpParam)rnrn SOCKET sock;rn sock = reinterpret_cast(lpParam);rn /*...*/rnrn
为什么不执行线程?请看程序
#includern#includernFILE *file1;rnrnvoid * thread_test()rnrn for (int i=0;i<10 ;i++ )rn rn printf("Here is son!\n");rn rn fclose(file1);rnrnrn main()rnrn pthread_t tid;rn int x;rn x=pthread_create(&tid,NULL,thread_test,NULL);rn if(x!=0)rn rn printf("creat error!\n");rn rnrn for (int j=0;j<10 ;j++ )rn rn printf("here is father\n");rnrn rnrnrnx=0,说明调用线程成功,但是结果却没有打印出线程的东西,为什么呢?rn
线程问题-主程序线程为什么不执行
代码和输出结果如下, 问题是 rnChild #1 joined.rnChild #2 joined.rnChild #3 joined.rn这三个主程序的语句为什么在最后执行? 当其它线程sleep的时候,主程序还不能执行吗?rn为什么? 谢谢!rnrnusing System;rnusing System.Threading;rnrnclass MyThreadrnrn public int count;rn public Thread thrd;rnrn public MyThread(string name)rn rn count = 0;rn thrd = new Thread(run);rn thrd.Name = name;rn thrd.Start();rn rnrn void run()rn rn Console.WriteLine(thrd.Name + " starting.");rnrn dorn rn Thread.Sleep(1000);rn Console.WriteLine("In " + thrd.Name +rn ", count is " + count);rn count++;rn while (count < 5);rnrn Console.WriteLine(thrd.Name + " terminating.");rn rnrnrnclass MainClassrnrn public static void Main()rn rn Console.WriteLine("Main thread starting.");rnrn MyThread mt1 = new MyThread("Child #1");rn MyThread mt2 = new MyThread("Child #2");rn MyThread mt3 = new MyThread("Child #3");rnrn mt1.thrd.Join();rn Console.WriteLine("Child #1 joined.");rnrn mt2.thrd.Join();rn Console.WriteLine("Child #2 joined.");rnrn mt3.thrd.Join();rn Console.WriteLine("Child #3 joined.");rnrn Console.WriteLine("Main thread ending.");rnrn Console.ReadLine();rn rnrnrnrnrn这是输出结果:rnMain thread starting.rnChild #1 starting.rnChild #2 starting.rnChild #3 starting.rnIn Child #2, count is 0rnIn Child #1, count is 0rnIn Child #3, count is 0rnIn Child #2, count is 1rnIn Child #1, count is 1rnIn Child #3, count is 1rnIn Child #2, count is 2rnIn Child #1, count is 2rnIn Child #3, count is 2rnIn Child #2, count is 3rnIn Child #1, count is 3rnIn Child #3, count is 3rnIn Child #2, count is 4rnChild #2 terminating.rnIn Child #1, count is 4rnChild #1 terminating.rnIn Child #3, count is 4rnChild #3 terminating.rnChild #1 joined.rnChild #2 joined.rnChild #3 joined.rnMain thread ending.
ThreadPoolExecutor对线程的管理
rfffff
线程不执行
编了程序,要在用到线程,rn2个参数放结构体里了。rn循环起线程,跟了一下,第一个线程起不来。(不进线程里面)。以后的都能进。。rn怎么会事啊 。。???rn
线程优化-使用线程池ThreadPoolExecutor
ThreadPoolExecutor是线程池的实现类 类内部用一个队列管理任务 通过Executor框架的工具类Executors,可以创建3钟类型的ThreadPoolExecutor -FiexedThreadPool -SinlgeThreadExecutor -CachedThreadPool 下面对3中线程池进行详细说明: FixThreadPool 被称
关于android ThreadPoolExecutor 线程复用的理解
**首先,ThreadPoolExecutor线程复用不是说可以随时想调用就调用! 举个例子:不启用线程池的话,一个任务(Runnable)对应一个线程(Thread) 去处理,这是最普通的做法,但是如果我们有100个任务呢?没错!那将会有100 个线程(Thread),每个线程只处理自身的任务。想想就害怕啊,你说一个四核 的某米最大并发线程数就是9个,同时开启100个线程会怎么样?分分钟...
ThreadPoolExecutor线程的创建与销毁分析
ThreadPoolExecutor线程的创建与销毁分析 固定线程池(newFixedThreadPool) 单例线程池(newSingleThreadExecutor) 缓存线程池(newCachedThreadPool)
阿里推荐的线程使用方法 ThreadPoolExecutor
阿里推荐原因:使用线程池可以减少创建和销毁线程上所花的时间以及系统资源的开销,然后之所以不用Executors自定义线程池,用ThreadPoolExecutor是为了规范线程池的使用,还有让其他人更好懂线程池的运行规则。先说一下关于线程的概念任务:线程需要执行的代码,也就是Runnable任务队列:线程满了,就任务就放入任务队列里等待,等其他任务在线程里执行完,这个线程就空出来了,任务队列就将最...
线程的创建与线程池ThreadPoolExecutor,Executors
线程的创建与线程池及线程池工具类 1.线程的创建方式 1.1继承Thread类重写run方法 public class Test { public static void main(String[] args) { Thread thread = new MyThread(); thread.setName("mythread001"); ...
ThreadPoolExecutor 源码分析(一)-- 线程工作流程
一、序言        关于“池”的概念,我的理解是它是为了让我们更快的获得资源,节省时间,在我所知的所有池(线程池、连接池、常量池、缓存池、对象池等等),都是这个作用,这里我们仅仅分享线程池的相关理解。        1.我们什么时候要用线程池?        在JAVA 里面我们一切都是对象,线程(Thread)同样也是对象,只要是对象那么就要涉及创建、使用、回收等三个主要步骤。通常...
ThreadPoolExecutor线程池及线程扩展策略
一、概述 1、ThreadPoolExecutor作为java.util.concurrent包对外提供基础实现,以内部线程池的形式对外提供管理任务执行,线程调度,线程池管理等等服务; 2、Executors方法提供的线程服务,都是通过参数设置来实现不同的线程池机制。 3、先来了解其线程池管理的机制,有助于正确使用,避免错误使用导致严重故障。同时可以根据自己的需求实现自己的线程池 二、核心构造方法...
CWinThread线程启动,为什么不执行InitInstance()?
创建线程如下:rnCClientThread *pClientThread = (CClientThread*)(AfxBeginThread(RUNTIME_CLASS(CClientThread),THREAD_PRIORITY_HIGHEST,0,CREATE_SUSPENDED));rnResumeThread(pClientThread);rn我想在InitInstance()中执行线程初始化工作,但是却无法进入,不知道什么原因?rn
为什么新开启的线程代码不执行呢?
新开启的线程代码不能执行,是什么原因呢?单步跟踪也没有报错,但就是在rnThread thread=new Thread(new ThreadStart(Listen));执行完后就没有任何反应了,而Listen()中的代码始终没有执行。请教可能是什么原因?rnrnwindows应用程序主要代码如下:rnpublic class Form1 : System.Windows.Forms.Formrnrn//....变量定义rn[STAThread]rnstatic void Main() rnrn Application.Run(new Form1());rnrnpublic Form1()rnrn //rn // Windows 窗体设计器支持所必需的rn //rn InitializeComponent();rn label1.Text="testb";rn Thread thread=new Thread(new ThreadStart(Listen)); rnrnrnpublic void Listen()rnrn label1.Text="testc";rn IPAddress ipAddress=Dns.Resolve("localhost").AddressList[0];rn TcpListener tcpListener=new TcpListener(ipAddress,2112);rn tcpListener.Start();rn //....此处代码省略rnrn
为什么不执行?
select a.行业 ,b.户数 from 行业顺序 a left join (select YGZ_MC , count(YGZ_MC) as 户数 from temp一般人 where datediff(day, GZZSYXQ ,'2013-8-1') >=0 and datediff(day, HZDJRQ ,'2013-8-1') >0 rn group by YGZ_MC ) b on a.行业= b.YGZ_MC rnrnrn行业顺序里面存储 A B C Drn如果 where datediff(day, GZZSYXQ ,'2013-8-1') >=0   光有一个条件的话,正常应该输出为rnA 10rnB 11rnC 100rnD 6rnrn但是现在  where datediff(day, GZZSYXQ ,'2013-8-1') >=0 and datediff(day, HZDJRQ ,'2013-8-1') >0  跟着两个条件 执行起来  跟行业顺序表就无关 程序结果就变为:rnC 10rnB 12rnA 12rnD 12rnrn请问怎么回事
为什么不执行
[code=Perl]tash.shrn如下 rn*/6 * * * * /cygdrive/d/2.sh>>/cygdrive/d/log.log[/code]rnrn当rnrncrontab tash.sh 添加任务后,为什么不执行,rn但是 rn单独执行 /cygdrive/d/2.sh>>/cygdrive/d/log.log 是可以写进东西到log里面。rn求高手
beginthread的线程函数不执行
线程函数RunModule里面程序不执行,各位提供点问题的可能原因,谢谢rn[code=C/C++]rnvoid RunModule(LPVOID lpParam)rnrn SHELLEXECUTEINFO* pseinfo = (SHELLEXECUTEINFO*)lpParam;rn if (NULL == pseinfo)rn return ;rn rn HWND hWnd =::FindWindow(NULL, pseinfo->lpParameters);rnrn if (NULL == hWnd)rn ::ShellExecuteEx(pseinfo);rn if (pseinfo->hProcess)rn ::WaitForSingleObject(pseinfo->hProcess, INFINITE);rn rn...rnrnrnvoid CInfoManager::RunTKBModule(LPCTSTR lpszFilePath, LPCTSTR lpszWnidowTitle, HWND *phWnd)rnrn ASSERT(lpszFilePath != NULL);rn ASSERT(AfxIsValidString(lpszFilePath));rn ASSERT(lpszWnidowTitle != NULL);rn ASSERT(AfxIsValidString(lpszWnidowTitle));rnrn HWND hWnd = ::FindWindow(NULL, lpszWnidowTitle);rn SHELLEXECUTEINFO seinfo;rn seinfo.hwnd = NULL;rn seinfo.fMask = SEE_MASK_NOCLOSEPROCESS;rn seinfo.lpVerb = _T("Open");rn seinfo.lpFile = lpszFilePath;rn seinfo.nShow = SW_SHOW;rn seinfo.lpParameters = lpszWnidowTitle;rn seinfo.cbSize = sizeof(seinfo);rn _beginthread(RunModule, 0, (LPVOID)&seinfo);rn Sleep(1000);rnrn while (NULL == hWnd && phWnd)rn //这里死循环rn Sleep(0);rn hWnd = ::FindWindow(NULL, lpszWnidowTitle);rn rn if (phWnd)rn *phWnd = hWnd;rnrn[/code]
Android 蓝牙线程不执行
[code=java]private Handler handler = new Handler()rn rn public void handlerMessage(Message msg)rn rn Toast.makeText(DayMainActivity.this, String.valueOf(msg.obj), Toast.LENGTH_LONG).show();rn super.handleMessage(msg);rn rn rn ;rn rn private class AcceptThread extends Threadrn rn private BluetoothServerSocket serversocket;rn private BluetoothSocket socket;rn rn private InputStream is;rn private OutputStream os;rn public AcceptThread()rn try rn serversocket = mBluetoothAdapter.listenUsingInsecureRfcommWithServiceRecord(NAME, MY_UUID);rn catch (Exception e) rn // TODO: handle exceptionrn rn rn public void run()rn // 截获客户端的蓝牙消息rn try rn //显示进程。rn Toast.makeText(DayMainActivity.this, "线程执行", 1000).show();rn socket = serversocket.accept();// 如果阻塞了,就会一直停留在这里rn is = socket.getInputStream();rn os = socket.getOutputStream();rn rn while(true)//不断从客户端读取数据rn byte[] buffer = new byte[128];rn // 读取rn int count = is.read(buffer);rn // 如果读取到了,我们就发送刚rn Message msg = new Message();rn msg.obj = new String(buffer,0,count,"utf-8");rn handler.sendMessage(msg);rn rn rn catch (Exception e) rn // TODO: handle exceptionrn rn rn rn rn [/code]
AfxBeginThread创建的线程不执行
当不执行,下列函数打开文件时,能够执行到AfxBeginThread(Sample,this,THREAD_PRIORITY_TIME_CRITICAL);rn产生的线程中去。但当执行下列函数,打开初始文件初始文本控件时,就进入不到线程中去????rn这是为什么的呢????rn[img=https://forum.csdn.net/PointForum/ui/scripts/csdn/Plugin/003/onion/37.gif][/img]rn[code=c]void CMainFrame::OnFileOpen() rnrn // TODO: Add your command handler code herern char filefilter[]="Measure Files (*.ini)|*.ini||";rn CFileDialog openfile(TRUE,NULL,NULL,OFN_HIDEREADONLY | rn OFN_OVERWRITEPROMPT,filefilter);rn if(IDOK==openfile.DoModal())rn rn theApp.m_paradata.m_filename=openfile.GetPathName();rn bool suc=0;rn suc=theApp.m_paradata.ReadFile();rn if(suc)rn rn measdlg1->Update(TRUE);rn rn rn[/code]
CustomValidator1_ServerValidate为什么不执行?为什么。。。
<%@ Page Language="C#" %>rnrnrnrn rnrnrnrn Untitled Pagernrnrn rn rn rn rn rn rn rn rn rnrnrnrn郁闷,真不知道哪里有毛病。rn无Web.Config,没有引入任何JS,就这一个页面。rnonservervalidate="CustomValidator1_ServerValidate"大小写并没关系的,运行无错。rnrn为什么???为什么???为什么???为什么???
ThreadPoolExecutor
看了源码,感觉ThreadPoolExecutor的每个RunAble都是新建一个Worker及Thread的来完成的。rn不知道是不是这样的?
线程学习三:线程池ThreadPoolExecutor 与 Executors
/**      * Creates a new {@code ThreadPoolExecutor} with the given initial      * parameters.      *      * @param corePoolSize the number of threads to keep in the pool, even      *        if they ar
python 多线程,详细教程,线程同步,线程加锁,ThreadPoolExecutor
python 多线程的使用多线程主要用于大量的IO操作时的并发执行,以此来提高效率!多进程主要用于大量的计算,进而充分发挥CPU的性能!这里主要讲述两种多线程的使用:threading.Threadconcurrent.futures.ThreadPoolExecutor使用第二种方式需要先安装(对于python2.x)pip install futures基本使用第一种方式的简单使用:(注意:空...
ThreadPoolExecutor中运行线程名称的修改
项目中使用到了ThreadPoolExecutor,这个是挺好的东西,线程池的实现。但有一点不太爽的是,用Jprofiler调试由它创建的线程的时候,看到的都是pool-1-thread-1\2\3\4之类的。这是它自身的默认规则产生的,pool代表这是池,-1-代表是第几个ThreadPoolExecutor产生的,-thread-1是递增的。 所以每次我都要点 Thread Dumps 去查
手动配置ThreadPoolExecutor,执行线程任务
public class ThreadPoolTest2 {     public static void main(String[] args) {         ThreadPoolExecutor executor = new ThreadPoolExecutor(5, 10, 200, TimeUnit.MILLISECONDS,                 new ArrayBl...
[原]java线程API学习 线程池ThreadPoolExecutor
线程池ThreadPoolExecutor继承自ExecutorService。是jdk1.5加入的新特性,将提交执行的任务在内部线程池中的可用线程中执行。rnrn 构造函数rnrn ThreadPoolExecutor(int corePoolSize,rn int maximumPoolSize,rn long keepAliveTime,rn TimeUnit unit,rn BlockingQueue workQueue,rn ThreadFactory threadFactory,rn RejectedExecutionHandler handler)rnrn corePoolSize 线程池维护的核心线程数。为什么这里说核心线程数而不是最小线程数是因为在线程池被创建后,并不会直接创建corePoolSize个线程,而是等任务到来时临时创建。等按照需要创建了corePoolSize个线程之后,这些数量的线程即使闲置,也不会被线程池收回。这时即可以将这个值理解为线程池维护的最小线程数了。rn maximumPoolSize 线程池维护的最大线程数。rn keepAliveTime 当线程池中的线程数量大于corePoolSize,多出那部分数量的线程空闲keepAliveTime后会被收回。rn unit keepAliveTime的时间单位。可选的参数为java.util.concurrent.TimeUnit中的几个静态属性:NANOSECONDS、MICROSECONDS、MILLISECONDS、SECONDS。rn workQueue 存放通过execute方法提交给线程等待执行的任务的队列。rn threadFactory 负责给线程池创建线程的工厂。rn handler 在当队列达到极限导致任务执行阻塞时执行的处理策略。handler有四个选择:ThreadPoolExecutor.AbortPolicy(抛出java.util.concurrent.RejectedExecutionException异常)。ThreadPoolExecutor.CallerRunsPolicy(重试添加当前的任务,他会自动重复调用execute方法)。ThreadPoolExecutor.DiscardOldestPolicy(抛弃旧的任务)。rn ThreadPoolExecutor.DiscardPolicy(抛弃当前的任务)。rnrn 对于一般的应用,我们不用通过构造函数来创建线程池,而是用一些封装过的工具方法,这些方法设置了大多数参数的缺省值。只有对线程池的特性有更高的要求时,才直接使用构造函数。rnrn Executors.newCachedThreadPool(创建自动增加或减少容量的线程池)rnrn Executors.newFixedThreadPool(创建固定容量的线程池)rnrn Executors.newSingleThreadExecutor(单独线程的线程池)。rnrn 下面是一些高级特性rn · 关于corePoolSize和maximumPoolSizernrn ThreadPoolExecutor会根据corePoolSize和maximumPoolSize的值调整线程池中线程的数量。当通过ThreadPoolExecutor.execute方法向线程池提交一个新的任务时,如果线程池当前线程数量小于corePoolSize,就算有线程空闲,也会在创建一个线程执行这个任务;如果线程池当前线程数量大于corePoolSize又小于maximumPoolSize,只有当可用线程不够的时候才会创建新的线程。如果不希望系统动态增减线程数量,则将corePoolSize和maximumPoolSize数值设置为一样的值。如果将maximumPoolSize设置为一个特别大的值如Integer.MAX_VALUE,则ThreadPoolExecutor成为了一个能够容纳大量并发任务的线程池。一般来说corePoolSize和maximumPoolSize是在构造ThreadPoolExecutor对象时设置好的,当仍然可以调用ThreadPoolExecutor.setCorePoolSize 和ThreadPoolExecutor.setMaximumPoolSize 方法修改这两个属性。rn · 关于线程创建rnrn 线程池中的线程是由ThreadFactory创建。如果不特别指定,会使用Executors.defaultThreadFactory创建位于同一个线程组,相同优先级(NORM_PRIORITY)的非守护线程。如果由你来指定ThreadFactory,你可以定制线程名字,线程组,优先级,是否为守护线程等属性。rnrn· 直到需要时才开始创建线程rnrn缺省情况下,在线程池刚刚创建好之后其中是没有任何线程存在的。直到向线程池中提交了任务。可以通过复写ThreadPoolExecutor.perstartCoreThread或ThreadPoolExecutor.prestartAllCoreThreads方法改变默认行为。rnrn · 线程的存活时间rnrn 如果线程池中当前线程数大于corePoolSize,如果超过keepAliveTime后仍然没有使用,则超出部分会被终止掉。当需要更多线程的时候,再重新创建。这个属性也可以通过setKeepAliveTime修改。rn · 队列rnrn BlockingQueue用来管理被提交进来等待执行的任务。是否进入queue和线程池的容量有关。如果线程池中运行的线程小于corePoolSize,新的任务不会进入queue而是在新建的线程中执行。如果线程池中运行的线程大于或等于corePoolSize,更倾向于将任务加入queue而不是新建线程。如果queue满了,则创建新的线程执行任务。如果线程数量大雨了maximumPoolSize,任务被拒绝。rnrn 以下是三种列队的策略:rnrn 1.直接传递:这也是缺省的实现使用SynchronousQueue,直接将队列中的任务转交给线程。如果将任务提交给队列时没有足够的线程处理这个任务,新的线程会被创建。一般来说需要将maximumPoolSize设置为最大以避免出现拒绝新提交来的任务的情况出现。当然了如果任务提交的速度大过了处理任务的速度会引起线程池中线程无限增长的问题。rnrn 2.无限队列:使用不限制容量的队列LinkedBlockingQueue。当所有corePoolSize的线程都在忙碌时新提交进来的任务在队列中等待。也就是说,即使线程池中的线程数小于maximumPoolSize,也不会有新的线程被创建(maximumPoolSize参数失效)。这种策略适用于提交来的各个任务相互独立的场景。例如,一个网页服务来说,使用这种策略能平滑瞬间突发的访问请求。rnrn 3.有限队列:使用有限队列防止将maximumPoolSize设置为最大时,资源耗尽的问题。调整队列大小和maximumPoolSize之间关系比较就变得重要了。使用大容量队列和较小的线程数可以降低CPU和资源的使用但会导致效率低下。小容量的队列需要相对较大的maximumPoolSize配合,增加了CPU调度线程的负担。rn · 任务拒绝rnrn 调用ThreadPoolExecutor.execute方法提交新任务时,如果线程池已经被停止运行或线程数量、队列数量已满,RejectedExecutionHandler.rejectedExecution被调用。rnrn =============================================================================================rnrn 上面说的都有点抽象,确实得在使用的时候细细研究才成。不过如果想做到遇到问题将其信手拈来,还是有必要记住这个线程池处理的基本逻辑的。下面就举个现实生活中的例子帮助理解一下。rnrn 我们可以把一个线程池(ThreadPoolExecutor)想成公司的一个部门rnrn A(Executors.newCachedThreadPool):这个部门负责处理从客户那里分配过来的任务(Task)。在部门刚刚建立之初人力资源部设定了部门人员的上限(maximumPoolSize=60)和下限(corePoolSize=0),并要求部门经理等到第一个任务到来的时候才可以招收第一个组员(直到需要时才创建线程)。部门还制定了一个自己的工作制度,那就是我们绝不能够让任务积压!部门一成立,任务便从客户那边分配过来,部门经理为每一个任务招收一名员工。当员工完成手头的工作,部门经理为他们放假一段时间(keepAliveTime)进行休息。经过休整回来的员工,精神满满的等待接受经理给你派发的任务继续快乐的工作。可是这段时间经济不景气,没有那么多工作需要完成,处于节约成本的考虑,公司要把没有活干的非核心员工(由于corePoolSize=0,所以部门没有核心员工)解雇。到了年底,工作越来越多,部门经理继续招人,直到部门人数达到了上限,每一个员工都在拼命地工作没有一丝喘息的机会。这时又一个任务分配给了这个命苦的部门,也就是这个任务成为了击垮部门的最后一根稻草。部门经理受不了了,决定抗议:我们干不了更多的工作了(AbortPolicy)!rnrn B(Executors.newFixedThreadPool):这个部门负责处理从客户那里分配过来的任务(Task)。在部门刚刚建立之初人力资源部设定了部门人员的下限(corePoolSize)。并要求部门经理等到第一个任务到来的时候才可以招收第一个组员(直到需要时才创建线程)。部门还制定了一个自己的工作制度,那就是我们绝不能够让任务积压的太多(LinkedBlockingQueue.capacity)!部门一成立,任务便从客户那边分配过来,部门经理为每一个任务招收一名员工。一直等到部门人数达到部门人员的下限就不能再招人了。多余的任务就要搁置在任务积压列表中,等其他任务完成后再逐个完成。由于这个部门都是核心员工,所以大不用担心被解雇的问题了。当分配给部门的任务打过了积压任务的上限时,部门经理调出来说:我们干不了更多的工作了(AbortPolicy)!这个部门的工作人员下限可以设置,极端情况下部门只有一个员工(Executors.newSingleThreadExecutor)。rnrn 后来公司觉得,如果派发给部门的任务过多时,部门经理仅仅跳出来喊一声拒绝有点太过简单,还应该允许他做更多的事情化解危机。于是部门经理逐渐学会了ThreadPoolExecutor.CallerRunsPolicy(重试添加当前的任务,他会自动重复调用execute方法)。ThreadPoolExecutor.DiscardOldestPolicy(抛弃旧的任务)。 ThreadPoolExecutor.DiscardPolicy(抛弃当前的任务)。rnrn 由此可见,ThreadPoolExecutor线程池,兼顾了使用的方便性和扩展的灵活性。对于一般用途,借助Executors足以。若是将ThreadFactory ,RejectedExecutionHandler,BlockingQueue的不同实现灵活组合,又能满足各种情况下的需求真不枉为大家之作。rnrn ================================================================================================rnrn 顺便介绍一下,多线程大师Doug Lea。也就是java.util.concurrent包的作者。rnrn 如果IT的历史,是以人为主体串接起来的话,那么肯定少不了Doug Lea。这个鼻梁挂着眼镜,留着德王威廉二世的胡子,脸上永远挂着谦逊腼腆笑容,服务于纽约州立大学Oswego分校计算器科学系的老大爷。rnrn 说他是这个世界上对Java影响力最大的个人,一点也不为过。因为两次Java历史上的大变革,他都间接或直接的扮演了举足轻重的脚色。一次是由JDK 1.1到JDK 1.2,JDK1.2很重要的一项新创举就是Collections,其Collection的概念可以说承袭自Doug Lea于1995年发布的第一个被广泛应用的collections;一次是2004年所推出的Tiger。Tiger广纳了15项JSRs(Java Specification Requests)的语法及标准,其中一项便是JSR-166。JSR-166是来自于Doug编写的util.concurrent包。rnrn 值得一提的是: Doug Lea也是JCP (Java小区项目)中的一员。rnrn Doug是一个无私的人,他深知分享知识和分享苹果是不一样的,苹果会越分越少,而自己的知识并不会因为给了别人就减少了,知识的分享更能激荡出不一样的火花。《Effective JAVA》这本Java经典之作的作者Joshua Blosh便在书中特别感谢Doug是此书中许多构想的共鸣板,感谢Doug大方分享丰富而又宝贵的知识。rn
ThreadPoolExecutor线程池运行机制分析-线程复用原理
介绍 我们在涉及到多线程开发时,必然就涉及到线程池的使用,在阿里巴巴-Java开发手册中说到: 【强制】线程资源必须通过线程池提供,不允许在应用中自行显示创建线程 说明:使用线程池的好处是减少在创建和销毁线程上所花费的时间以及系统资源的开销,解决资源不足的问题,如果不使用线程池,有可能造成系统创建大量同类线程而导致消耗完内存或“过度切换”问题。 这里的规范很强势,直接定义为【强制】,目的就是使...
java线程执行器框架介绍(一)--ThreadPoolExecutor
在java多线程开发中,当我们需要批量执行多个任务线程时,可以使用java的执行器框架。 也就是Executors工厂类生成的各种Executor实现类。我们在这里介绍ThreadPoolExecutor。 1、由Executors工厂类生成的ThreadPoolExecutor包含如下几类: a)newCachedThreadPool,不指定线程个数,通常用于执行线程不多的情况; b
ThreadPoolExecutor最佳实践--如何选择线程数
去年的一篇《ThreadPoolExecutor详解》大致讲了ThreadPoolExecutor内部的代码实现。 总结一下,主要有以下四点: 当有任务提交的时候,会创建核心线程去执行任务; 当核心线程数达到corePoolSize时,后续提交的都会进BlockingQueue中排队; 当BlockingQueue满了(offer失败),就回创建临时线程; 当线程总数达到maximumPoo...
ThreadPoolExecutor是如何做到线程重用的
前言: 看关于ThreadPoolExecutor参数时,看到了keepaliveTime这个参数,这个参数的意思是:“当线程数大于CorePoolSize时,如果有没有等到新的Task,到了keepaliveTime时间后,就自动终止掉”。那么如果在这个时间之前,等到了新的Task,就可以重用这个线程。到底是怎么重用线程的呢? 正文:原理如下: 前提条件:假如coreSize=3,maxS
ThreadPoolExecutor 是如何做到线程重用的
前言: 看关于ThreadPoolExecutor参数时,看到了keepaliveTime这个参数,这个参数的意思是:“当线程数大于CorePoolSize时,如果有没有等到新的Task,到了keepaliveTime时间后,就自动终止掉”。那么如果在这个时间之前,等到了新的Task,就可以重用这个线程。到底是怎么重用线程的呢?   ThreadPoolExecutor mExecut...
扩展ThreadPoolExecutor打印线程错误堆栈
在使用JDK Executors产生线程池执行任务时,如果使用threadPool.submit(Runnable)来提交任务,且不调用future.get时,如果线程发生错误,程序是不会打印错误堆栈的,比如下面的程序,当i==0时,100/i发生运行时异常,只有四组输出(应该有五组),但是程序不会打印任何异常信息, import java.util.concurrent.Synchronous
相关热词 c#部署端口监听项目、 c#接口中的属性使用方法 c# 昨天 c#func链接匿名方法 c#怎么创建文件夹 c#从键盘接收空格 c#da/ad c#部门请假管理系统 c#服务器socket c# 默认的访问修饰符