Java线程及其线程的异同与其执行区别

线程概念


线程是计算机的最小执行单位。进程有多条线程,但是线程只有一个进程。如果程序的执行路径有多条,则称之为多线程程序。

线程的优先级有协同式调度和抢占式调度

线程通信

三个函数可以当做线程通信的函数
wait();
notify();
notifyAll();

注意:

wait()、notify()和notifyAll()方法是本地方法,并且为final方法,无法被重写。

wait()函数使线程进入等待状态,而且必须拥有这个线程的锁。

调用某个对象的notify()方法能够唤醒一个正在等待这个对象的monitor的线程。

可以唤醒这个线程。如果有多个线程,那只能唤醒其中一个线程。

notifyAll()函数可以唤醒monitor所有的线程。

线程池

提供一定数量的线程,来完成更多的线程工作

线程池的种类

单个线程:

newSingleThreadExecutor();
线程池中只有一个线程执行。

ExecutorService newSingleThreadExecutor = Executors.newSingleThreadExecutor();
	
		for(int i=0;i<4;i++){
			newSingleThreadExecutor.submit(new Runnable(){

				@Override
				public void run() {
					try {
						Thread.sleep(300);
					} catch (InterruptedException e) {
						// TODO Auto-generated catch block
						e.printStackTrace();
					}
					System.out.println(Thread.currentThread().getName()+"执行完成>>>>>");
				}
				
			}

结果为

在这里插入图片描述

多个线程

newFixedThreadPool(int nThreads)
线程池中有多个线程同时执行,多个线程执行遵循Java的优先级调度。
(int nThreads):设置执行的线程个数,必须是int型。

ExecutorService newSingleThreadExecutor = Executors.newFixedThreadPool(4);
		CountDownLatch c = new CountDownLatch(10);// 同步辅助类,所有的线程所共享的
		long s = System.currentTimeMillis();// 时间
		for (int i = 0; i < 4; i++) {
			newSingleThreadExecutor.submit(new MyTask2(c));
		}
		System.out.println(">>>>>>>>>>>>");
		
		newSingleThreadExecutor.shutdown();// 线程池的关闭
		
		while(true){
			if(c.getCount()==0){
				System.out.println("线程池已经执行结束");
				System.out.println("执行时间为:"+(System.currentTimeMillis()-s)+" 毫秒数");
				break;
			}
		}

结果为

在这里插入图片描述

带缓冲的线程池

newCachedThreadPool()
它创建了一个可缓存的线程池。当有新的任务提交时,有空闲线程则直接处理任务,没有空闲线程则创建新的线程处理任务,队列中不储存任务。线程池不对线程池大小做限制,线程池大小完全依赖于操作系统(或者说JVM)能够创建的最大线程大小。

ExecutorService executor = Executors.newCachedThreadPool();
		final CountDownLatch c = new CountDownLatch(10);// 所有的线程所共享的
	
		for (int i = 0; i < 4; i++) {
			executor.submit(new Runnable() {

				public void run() {
					System.out.println("hello");
					c.countDown();

				}

			});
		}

结果为

在这里插入图片描述

可调度的线程池

ScheduledThreadPoolExecutor(int corePoolSize)
这种线程池可以进行调度处理。可另外调度在给定延迟之后运行的命令,或定期执行(类似于每天的闹钟提醒,使线程进入循环,谨慎使用)。

延迟任务执行时间早于启用,但没有任何实时保证,在启用后,他们将开始。 计划执行完全相同执行时间的任务将以先进先出(FIFO)的提交顺序启用。

提交的任务在运行之前被取消,执行被抑制。 默认情况下,这样一个取消的任务在工作队列中不会自动删除,直到其延迟过去。

虽然这样可以进一步检查和监控,但也可能导致取消任务的无限制保留。 为避免这种情况,请将setRemoveOnCancelPolicy(boolean)设置为true ,这将导致任务在取消时立即从工作队列中删除。

A ThreadPoolExecutor可另外调度在给定延迟之后运行的命令,或定期执行。 该类优选的是Timer需要多个工作线程时,或当附加灵活性或能力ThreadPoolExecutor需要

eclipse中对ScheduledThreadPoolExecutor的解释

public <V> ScheduledFuture<V> schedule(Callable<V> callable,
                                           long delay,
                                           TimeUnit unit)

定时器定时任务

ScheduledThreadPoolExecutor方法中的时间控制函数

TimerTask task =new TimerTask(){
@Override public void run() {
System.out.println(">>>"+System.currentTimeMillis());
System.out.println("hello");
}};
// 定时器
Timer timer=new Timer(); timer.schedule(task, 1000, 2000);// 毫秒

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值