多线程 线程池 守护线程

守护线程只是个概念问题,一句话可以总结(不知道总结的对不对^_^);

当所有用户线程都结束的时候,守护线程也就结束了,当有用户线程存在的时候,守护线程就是一个普通线程。

main线程不可以设置成守护线程,应为只有在线程调用start方法前,才可以设置线程为守护线程,main线程是jvm创建的

多线程以及线程池的问题

import java.io.DataInputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

public class Down {
	ExecutorService executorService = Executors.newFixedThreadPool(3);

	public void down() {

		boolean a = new File("C:/123/").mkdir();
		List<String> urls = new ArrayList<String>();
		urls.add("http://img1.cache.netease.com/catchpic/6/66/66F01DF5FA318F96FE695D4A1CA1A698.jpg");
		urls.add("http://img1.cache.netease.com/catchpic/C/C5/C5625E5D94AFBBF73DBB8C88D762A634.jpg");
		urls.add("http://img1.cache.netease.com/catchpic/C/C5/C5625E5D94AFBBF73DBB8C88D762A634.jpg");
		urls.add("http://img1.cache.netease.com/catchpic/C/C5/C5625E5D94AFBBF73DBB8C88D762A634.jpg");
		urls.add("http://img1.cache.netease.com/catchpic/C/C5/C5625E5D94AFBBF73DBB8C88D762A634.jpg");
		urls.add("http://img1.cache.netease.com/catchpic/C/C5/C5625E5D94AFBBF73DBB8C88D762A634.jpg");
		urls.add("http://img1.cache.netease.com/catchpic/C/C5/C5625E5D94AFBBF73DBB8C88D762A634.jpg");
		urls.add("http://img1.cache.netease.com/catchpic/C/C5/C5625E5D94AFBBF73DBB8C88D762A634.jpg");
		urls.add("http://img1.cache.netease.com/catchpic/C/C5/C5625E5D94AFBBF73DBB8C88D762A634.jpg");
		urls.add("http://img1.cache.netease.com/catchpic/C/C5/C5625E5D94AFBBF73DBB8C88D762A634.jpg");
		urls.add("http://img1.cache.netease.com/catchpic/C/C5/C5625E5D94AFBBF73DBB8C88D762A634.jpg");
		for (int i = 0; i < urls.size(); i++) {
			executorService.execute(new DownImg(urls.get(i), i));
		}

	}

	public static void main(String[] args) {
		Down down = new Down();
		down.down();
		// down.executorService.isTerminated()
		down.executorService.shutdown();
		while (true) {
			if (down.executorService.isTerminated()) {
				System.out.println("所有的已经下载完毕");
				break;
			}

			try {
				Thread.sleep(100);
			} catch (InterruptedException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}

	}
}

class DownImg implements Runnable {
	int i;
	String imgUrl;
	URL url;
	int len;
	byte[] bytes = new byte[1024];

	public DownImg(String imgUrl, int i) {
		this.i = i;
		this.imgUrl = imgUrl;
		try {
			url = new URL(imgUrl);
		} catch (MalformedURLException e) {
			e.printStackTrace();
		}
	}

	@Override
	public void run() {
		try {
			DataInputStream dataInputStream = new DataInputStream(
					url.openStream());

			FileOutputStream fileOutputStream = new FileOutputStream("C:/123/"
					+ i + ".jpg");
			while ((len = dataInputStream.read(bytes)) > 0) {
				fileOutputStream.write(bytes, 0, len);
			}
			dataInputStream.close();
			fileOutputStream.close();
			System.out.println("第" + i + "张下载完毕");
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}

	}
}

  

down.executorService.shutdown();这个方法,是在线程池中的线程只执行一次任务;如果没有调用,线程池的线程执行完一次任务后,会一直处于等待状态
时间: 2024-10-20 02:39:33

多线程 线程池 守护线程的相关文章

Java:多线程&lt;四&gt; Lock、停止线程、守护线程、join、优先级&amp;yield

Java1.5以后,Condition将Object监视器方法(wait, notify, notifyAll)分解成截然不同的对象,以便通过这些对象与任意Lock实现组合使用为每个对像提供多个等待set(wait-set).期中,Lock替代了synchronized方法和语句的使用,Condition替代了Objetc监视器方法和使用. 当线程处于冻结状态,就有可能线程就不会结束,interrupt用于清除线程的冻结状态.当没有指定的方式让冻结状态的线程恢复到运行状态时,这是需要对冻结状态进

Java多线程系列 JUC线程池07 线程池原理解析(六)

 关闭“线程池” shutdown()的源码如下: public void shutdown() { final ReentrantLock mainLock = this.mainLock; // 获取锁 mainLock.lock(); try { // 检查终止线程池的“线程”是否有权限. checkShutdownAccess(); // 设置线程池的状态为关闭状态. advanceRunState(SHUTDOWN); // 中断线程池中空闲的线程. interruptIdleWork

由浅入深理解Java线程池及线程池的如何使用

前言 多线程的异步执行方式,虽然能够最大限度发挥多核计算机的计算能力,但是如果不加控制,反而会对系统造成负担.线程本身也要占用内存空间,大量的线程会占用内存资源并且可能会导致Out of Memory.即便没有这样的情况,大量的线程回收也会给GC带来很大的压力. 为了避免重复的创建线程,线程池的出现可以让线程进行复用.通俗点讲,当有工作来,就会向线程池拿一个线程,当工作完成后,并不是直接关闭线程,而是将这个线程归还给线程池供其他任务使用. 接下来从总体到细致的方式,来共同探讨线程池. 总体的架构

Java用户线程和守护线程

1.用户线程和守护线程的区别用户线程和守护线程都是线程,区别是Java虚拟机在所有用户线程dead后,程序就会结束.而不管是否还有守护线程还在运行,若守护线程还在运行,则会马上结束.很好理解,守护线程是用来辅助用户线程的,如公司的保安和员工,各司其职,当员工都离开后,保安自然下班了. 2.用户线程和守护线程的适用场景由两者的区别及dead时间点可知,守护线程不适合用于输入输出或计算等操作,因为用户线程执行完毕,程序就dead了,适用于辅助用户线程的场景,如JVM的垃圾回收,内存管理都是守护线程,

001-多线程基础-进程线程、线程状态、优先级、用户线程和守护线程

一.进程与线程 1.DOS系统[单进程系统] 最早的时候DOS有一个特点:只要电脑有病毒,那么电脑就死机了. 原因:传统的DOS系统属于单进程系统,即:在同一时间段内只允许有一个程序运行. 2.Windows系统[多进程多线程] 电脑中毒也可以运行,但是会变慢 原因:因为在一个cpu.一块资源的情况下,程序利用一些轮转算法,可以让一个资源在一个时间段可以同时处理多个程序(进程),但是在一个时间点上只允许一个进程去执行. windows:任务管理器 linux:ps 在每一个进程上可以划分出若干个

JAVA笔记13__创建线程/线程休眠/等待线程终止/线程中断/守护线程

/** * 线程:是进程的一个执行路径,共享一个内存空间,线程之间可以自由切换,并发执行,一个进程最少有一个进程(单线程程序) * 多线程两种实现方法:1.继承Thread类 2.实现Runnable接口 */ public class Main { public static void main(String[] args) { MyThread t1 = new MyThread(); t1.start(); //启动线程 System.out.println("main"); S

线程系列06,通过CLR代码查看线程池及其线程

在"线程系列04,传递数据给线程,线程命名,线程异常处理,线程池"中,我们已经知道,每个进程都有一个线程池.可以通过TPL,ThreadPool.QueueUserWorkItem,委托与线程池交互.本篇体验:通过查看CLR代码来观察线程池及其线程. □ 通过编码查看线程池和线程 使用ThreadPool的静态方法QueueUserWorkItem把线程放入线程池,来看线程池线程和主程序线程的执行情况. class Program { static void Main(string[]

36 线程 队列 守护线程 互斥锁 死锁 可重入锁 信号量

线程 线程是操作系统最小的运算调度单位,被包含在进程中,一个线程就是一个固定的 执行流程 线程和进程的关系 线程不能单独存在 必须存在于进程中, 进程是一个资源单位,其包含了运行程序所需的所有资源 线程才是真正的执行单位 没有线程,进程中的资源无法被利用起来,所以一个进程至少包含一个线程,称之为主线程 当我们启动一个程序时,操作系统就会自己为这个程序创建一个主线程 线程可以由程序后期开启 ,自己开启线程称之为子线程 为什么需要线程 目的只有一个就是提高效率 就像一个车间 如果产量跟不上 就再造一

线程池和线程的选择

能用线程池就用线程池,线程池效率比线程高很多. 线程池处理线程的顺序不一定. 线程池不能手动关闭具体线程. 如果执行线程时间特别长,那手动创建线程,和放入线程池中没太大区别. 线程池非常适合做大量的小的运算.