이 기사는 인터뷰 중에 발생할 수 있는 스레드 풀 문제를 소개합니다. 도움이 필요한 친구들이 참고할 수 있는 내용입니다.
우리는 인터뷰 중에 멀티스레딩과 스레드 풀에 대한 질문을 자주 접하게 됩니다. 어떻게 대답해야 할까요? 오늘은 Java의 Thread Pool에 대해 알아 보겠습니다.
스레드 풀은 멀티 스레드 애플리케이션을 초기화하는 동안 스레드 모음을 만든 다음 새 스레드를 만드는 대신 새 작업을 수행해야 할 때 이러한 스레드를 재사용하는 것을 말합니다. 스레드 풀의 스레드 수는 일반적으로 사용 가능한 메모리 양과 애플리케이션 요구 사항에 따라 전적으로 달라집니다. 그러나 사용 가능한 스레드 수를 늘릴 수 있습니다. 스레드 풀의 각 스레드에는 작업이 할당되고 작업이 완료되면 스레드는 풀로 돌아가 다음 할당된 작업을 기다립니다.
직접 말하면 애플리케이션에 대해 여러 스레드를 실행하는 스레드 모음입니다.
스레드 풀을 사용하여 현재 문제를 해결했습니다.
스레드 풀을 사용하여 비디오에 여러 표지를 추가하여 시간과 리소스를 절약할 수 있습니다.
백그라운드 서버는 여러 사진을 지원하지 않습니다. 업로드, 스레드 풀을 사용하여 여러 장의 사진을 업로드하면 업로드 시간이 단축됩니다
효과 사진은 다음과 같습니다:
업로드 전: 9장의 사진은 최소 3초가 소요됩니다. 스레드 풀 최적화 후 9개의 이미지는 1초가 걸립니다.
멀티 스레드 애플리케이션에서 스레드를 사용하는 것은 다음과 같은 이유로 필요합니다.
1 생성 및 소멸되는 스레드 수를 줄이고 각 작업자 스레드를 재사용하고 여러 작업을 실행할 수 있습니다.
2. 과도한 메모리 소모로 인해 서버가 소진되는 것을 방지하기 위해 시스템 용량에 따라 스레드 풀에서 작동하는 스레드 수를 조정할 수 있습니다. (각 스레드에는 약 1MB의 메모리가 필요하며, 더 많은 스레드가 열리게 됩니다. 너무 크면 더 많은 메모리를 소비하고 결국 충돌이 발생합니다.
스레드 풀은 애플리케이션의 응답 시간을 향상시킵니다. 스레드 풀의 스레드는 준비되어 작업 할당을 기다리고 있으므로 애플리케이션은 새 스레드를 생성하지 않고도 이를 직접 사용할 수 있습니다.
스레드 풀은 CLR이 각 단기 작업에 대해 완전한 스레드를 생성하는 오버헤드를 절약하고 작업이 완료된 후 리소스를 회수할 수 있습니다.
스레드 풀은 현재 시스템에서 실행 중인 프로세스를 기반으로 스레드 시간 조각을 최적화합니다.
스레드 풀을 사용하면 각 스레드에 대한 속성을 설정하지 않고도 여러 작업을 시작할 수 있습니다.
스레드 풀을 사용하면 실행 중인 작업의 프로그램 매개변수에 대한 상태 정보가 포함된 개체 참조를 전달할 수 있습니다.
스레드 풀을 사용하면 특정 요청을 처리하기 위한 최대 스레드 수를 제한하는 문제를 해결할 수 있습니다.
늙은 Fafafa를 달래주세요
스레드 풀의 역할은 시스템의 실행 스레드 수를 제한하는 것입니다.
시스템 환경에 따라 스레드 수를 자동 또는 수동으로 설정하여 최상의 작업 효과를 얻을 수 있습니다. 시스템 리소스를 덜 낭비하고 시스템 혼잡과 비효율성을 유발합니다. 스레드 풀을 사용하여 스레드 수를 제어하고 다른 스레드는 줄을 서서 기다립니다. 작업이 실행된 후 대기열의 맨 앞에 있는 작업이 선택되고 실행이 시작됩니다. 대기열에 대기 중인 프로세스가 없으면 스레드 풀의 이 리소스가 대기 중입니다. 새 작업을 실행해야 할 때 스레드 풀에 대기 중인 작업자 스레드가 있으면 실행을 시작할 수 있습니다. 그렇지 않으면 대기 대기열에 들어갑니다.
예를 들어주세요
new Thread(new Runnable() { @Override public void run() { paPaPaYourGridFriend(); } }).start();
아직도 새 스레드를 사용하여 비동기 작업을 수행하고 있다면 종료입니다!
아직도 새 스레드를 사용하여 비동기 작업을 수행하고 있다면 종료입니다!
아직도 새 스레드를 사용하여 비동기 작업을 수행하고 있다면 종료입니다!
a. 새 스레드가 새 객체를 생성할 때마다 성능이 저하됩니다.
b. 스레드의 통합 관리가 부족하면 무제한의 새 스레드가 생성되고 서로 경쟁하며 너무 많은 시스템 리소스를 차지하여 충돌이나 OOM이 발생할 수 있습니다.
c. 예약 실행, 주기적 실행, 스레드 중단 등 추가 기능이 부족합니다.
1. newSingleThreadExecutor
단일 스레드 풀을 만듭니다. 이 스레드 풀에는 단 하나의 스레드만 작동하며 이는 모든 작업을 순차적으로 실행하는 단일 스레드와 동일합니다. 유일한 스레드가 비정상적으로 종료되면 새 스레드가 이를 대체합니다. 이 스레드 풀은 모든 작업이 제출된 순서대로 실행되도록 보장합니다.
2.newFixedThreadPool
创建固定大小的线程池。每次提交一个任务就创建一个线程,直到线程达到线程池的最大大小。线程池的大小一旦达到最大值就会保持不变,如果某个线程因为执行异常而结束,那么线程池会补充一个新线程。
3. newCachedThreadPool
创建一个可缓存的线程池。如果线程池的大小超过了处理任务所需要的线程,
那么就会回收部分空闲(60秒不执行任务)的线程,当任务数增加时,此线程池又可以智能的添加新线程来处理任务。此线程池不会对线程池大小做限制,线程池大小完全依赖于操作系统(或者说JVM)能够创建的最大线程大小。
4.newScheduledThreadPool
创建一个大小无限的线程池。此线程池支持定时以及周期性执行任务的需求。
private void TextnewSingleThreadExecutor(){ ExecutorService pool = Executors. newSingleThreadExecutor(); MyTask1 task1 = new MyTask1(); MyTask2 task2 = new MyTask2(); MyTask3 task3 = new MyTask3(); // pool.execute(task1); // pool.execute(task2); // pool.execute(task3); new Thread(task1).start(); new Thread(task2).start(); new Thread(task3).start(); } private class MyTask1 implements Runnable{ @Override public void run() { //循环输出 for(int i = 0; i <h5>ScheduledExecutorService</h5><p><img src="https://segmentfault.com/img/remote/1460000015702768" alt=" " title=" "><br></p><h5>newFixedThreadPool</h5><p><img src="https://segmentfault.com/img/remote/1460000015702769" alt=" " title=" "></p><h5><img src="https://segmentfault.com/img/remote/1460000015702770" alt=" " title=" "></h5><p style="max-width:90%"><strong>newCachedThreadPool</strong></p><p><img src="https://segmentfault.com/img/remote/1460000015702771" alt=" " title=" "><br></p><h6>相比new Thread,Java提供的四种线程池的好处在于:</h6>
a. 重用存在的线程,减少对象创建、消亡的开销,性能佳。
b. 可有效控制最大并发线程数,提高系统资源的使用率,同时避免过多资源竞争,避免堵塞。
c. 提供定时执行、定期执行、单线程、并发数控制等功能。
线程池真的是太好用了,如果在项目中通过线程池管理线程,,你将会发现其中的诸多优势!
20+个很棒的Android开源项目
2018年Android面试题含答案--适合中高级(下)一份完整的Android Studio搭建Flutter教程[](http://mp.weixin.qq.com/s?__b...
深入了解JAVA的线程中断方法经验之总结
子线程为什么不能更新UI线程详解
相关推荐:
위 내용은 PHP 인터뷰에서 접할 수 있는 스레드 풀에 대한 질문의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!