当前位置: 首页 > news >正文

彻底理解线程

1 线程的意义

操作系统支持多个应用程序同时执行,每个应用至少对应一个进程,彼此之间的操作和数据不受干扰。当一个进程需要磁盘IO的时候,CPU就切换到另外的进程,提高了CPU利用率。

有了进程,为什么还要线程?因为进程的成本太高了。

启动新的进程必须分配独立的内存空间,建立数据表维护它的代码段、堆栈段和数据段,这是昂贵的多任务工作方式。如果两个进程之间需要通信,要采用管道通信、消息队列、共享内存等等方式。线程可以看作轻量化的进程,或者粒度更小的进程。线程之间使用相同的地址空间,切换线程的时间远远小于切换进程的时间。一个进程的开销大约是线程开销的30倍左右。

随着操作系统的发展,进程已经演变成了线程容器的角色。进程是资源分配的最小单位,线程是CPU调度的最小单位。每一个进程中至少有一个线程,同一进程的所有线程共享该进程的所有资源。

2 详解Java线程

我们以Java语言和JVM为例,了解一下线程的实现原理。

2.1 线程的底层实现

启动一个Java程序会创建一个JVM进程,JVM创建、管理线程本质都是调用操作系统接口。

public class TestThreadStart {public static void main(String[] args) throws InterruptedException {Thread thread = new Thread(() -> {System.out.println("start thread now ");}, "TestThreadStart");thread.run();System.out.println("the state of thread is " + thread.getState().name());thread.start();System.out.println("the state of thread is " + thread.getState().name());}
}

以上代码演示了使用start方法启动线程,run方法只是执行同步方法,输出结果如下:

start thread now 
the state of thread is NEW
the state of thread is RUNNABLE
start thread now 

JVM源码文件 https://github.com/openjdk/jdk/blob/master/src/java.base/share/classes/java/lang/Thread.java 中,可以看到线程启动的start方法调用本地方法start0。

    public void start() {synchronized (this) {// zero status corresponds to state "NEW".if (holder.threadStatus != 0)throw new IllegalThreadStateException();start0();}}private native void start0();

源码文件 https://github.com/openjdk/jdk/blob/master/src/java.base/share/native/libjava/Thread.c 中,实现了start0方法映射到JVM本地方法。

static JNINativeMethod methods[] = {{"start0",           "()V",        (void *)&JVM_StartThread},{"stop0",            "(" OBJ ")V", (void *)&JVM_StopThread},{"isAlive0",         "()Z",        (void *)&JVM_IsThreadAlive},{"suspend0",         "()V",        (void *)&JVM_SuspendThread},{"resume0",          "()V",        (void *)&JVM_ResumeThread},{"setPriority0",     "(I)V",       (void *)&JVM_SetThreadPriority},{"yield0",           "()V",        (void *)&JVM_Yield},{"sleep0",           "(J)V",       (void *)&JVM_Sleep},{"currentCarrierThread", "()" THD, (void *)&JVM_CurrentCarrierThread},{"currentThread",    "()" THD,     (void *)&JVM_CurrentThread},{"setCurrentThread", "(" THD ")V", (void *)&JVM_SetCurrentThread},{"interrupt0",       "()V",        (void *)&JVM_Interrupt},{"holdsLock",        "(" OBJ ")Z", (void *)&JVM_HoldsLock},{"getThreads",       "()[" THD,    (void *)&JVM_GetAllThreads},{"dumpThreads",      "([" THD ")[[" STE, (void *)&JVM_DumpThreads},{"getStackTrace0",   "()" OBJ,     (void *)&JVM_GetStackTrace},{"setNativeName",    "(" STR ")V", (void *)&JVM_SetNativeThreadName},{"extentLocalCache",  "()[" OBJ,    (void *)&JVM_ExtentLocalCache},{"setExtentLocalCache", "([" OBJ ")V",(void *)&JVM_SetExtentLocalCache},{"getNextThreadIdOffset", "()J",     (void *)&JVM_GetNextThreadIdOffset}
};

在源码文件 https://github.com/openjdk/jdk/blob/master/src/hotspot/share/runtime/thread.cpp 可以看到启动线程依赖系统级方法os::start_thread(thread)

void Thread::start(Thread* thread) {// Start is different from resume in that its safety is guaranteed by context or// being called from a Java method synchronized on the Thread object.if (thread->is_Java_thread()) {// Initialize the thread state to RUNNABLE before starting this thread.// Can not set it after the thread started because we do not know the// exact thread state at that time. It could be in MONITOR_WAIT or// in SLEEPING or some other state.java_lang_Thread::set_thread_status(JavaThread::cast(thread)->threadObj(),JavaThreadStatus::RUNNABLE);}os::start_thread(thread);
}

在源码文件 https://github.com/openjdk/jdk/blob/master/src/hotspot/share/runtime/os.cpp 找到os::start_thread方法,可以看到系统创建了线程,并且状态设置为RUNNABLE。

void os::start_thread(Thread* thread) {OSThread* osthread = thread->osthread();osthread->set_state(RUNNABLE);pd_start_thread(thread);
}

Linux系统并没有把线程和进程区别对待,无论线程还是进程都是一个数据结构,用task_struct结构体表示,唯一的区别是共享的数据区域不同。

struct task_struct {// 进程状态long              state;// 虚拟内存结构体struct mm_struct  *mm;// 唯一进程号pid_t             pid;// 指向父进程的指针struct task_struct   *parent;// 子进程列表struct list_head      children;// 存放文件系统信息的指针struct fs_struct      *fs;// 进程/线程打开的文件指针struct files_struct   *files;
};

以上代码是 task_struct 的极少部分字段。mm_struct是进程的虚拟内存空间,files_struct是进程将要读写的文件。Linux系统将一切外设和磁盘文件都当做文件处理,files_struct代表所有的IO操作。


从上图可以看到,Linux创建进程和子进程会申请不同的内存空间,读写不同的文件;创建进程和进程下的线程,共享了内存空间,读写一样的文件。因此多线程应用程序要利用锁机制,避免在同一区域写入错乱数据的问题。

2.2 线程的生命周期

操作系统的线程生命周期可以分为五种状态。分别是:初始状态、可运行状态、运行状态、休眠状态和终止状态。JVM将线程等待状态细分成两种,一共六种状态。

  • NEW:创建。
  • RUNNABLE:运行中。
  • BLOCKED:受阻塞并等待某个监视器锁。
  • WAITING:无限期地等待。
  • TIMED_WAITING:等待指定时间。
  • TERMINATED:终止。
2.3 线程的优先级

操作系统调度线程有两种方式:

  • 协作式调度:当前线程完全占用CPU时间,执行时间由线程本身控制,直到运行结束,系统才执行下一个线程。可能出现一个线程一直占有CPU,而其他线程等待,导致整个系统崩溃。

  • 抢占式调度:操作系统决定下一个占用CPU时间的是哪一个线程,定期的中断当前正在执行的线程,任何一个线程都不能独占。不会因为一个线程而影响整个进程的执行,但是频繁阻塞和调度会造成系统资源的浪费。

JVM的线程调度默认是抢占式调度,线程调度器按照优先级决定调度哪个线程来执行。线程优先级的范围是1~10,默认的优先级是5,10极最高。线程优先级高的不一定先执行,优先级低只是获得调度的概率低,并不是一定最后被调度。通过setPriority()可以改变线程优先级。

2.4 JVM守护线程

守护线程是一种JVM中特殊的线程,在后台完成一些系统性的服务,比如垃圾回收。应用程序创建的线程叫做用户线程,完成具体的业务操作。程序中所有的用户线程执行完毕之后,不管守护线程是否结束,JVM都会自动结束。任何线程都可以通过setDaemon()设置为守护线程和用户线程,如下代码所示:

public class DaemonThreadDemo {public static void main(String[] args) {System.out.println("--主线程开始--");Thread thread = new Thread(() -> {while (true) {System.out.println("执行守护线程");}});thread.setDaemon(true);thread.start();System.out.println("--主线程结束--");}
}

程序运行结果:

--主线程开始--
--主线程结束--
执行守护线程
执行守护线程
执行守护线程
执行守护线程
执行守护线程
Process finished with exit code 0

当一个应用程序需要在后台持续做某件事情,就是守护线程的典型应用场景。比如开发一款社交软件,开启守护线程持续监听聊天消息。当应用程序退出时,守护线程一定会终止。

参考文章:https://www.codingbrick.com/archives/937.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.exyb.cn/news/show-140894.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈,一经查实,立即删除!

为何要打印日志?C++在高并发下如何写日志文件(附源码)?

为何要打印日志?让程序裸奔不是一件很快乐的事么? 有些BUG就像薛定谔的猫,具有波粒二象性,当你试图去观察它时它就消失了,当你不去观察它时,它又会出现。当你在测试人员面前赌咒发誓,亲自路演把…...

java获取TDengine链接错误:java.lang.NoSuchMethodError: setNumOfCols#4320

java根据本地tdengine驱动获取链接报错误java.lang.NoSuchMethodError: setNumOfCols#4320,网上查了一下是驱动版本不兼容还是怎么着,反正目前更换了许多个版本的依赖没有解决,我目前获取链接的方法是官网上给的rest方式: public…...

新概念英语(第四册,旧版)复习(原文及全文翻译)——Lesson 51 - Training Elephants(训象)

Lesson 51 - Training Elephants Two main techniques have been used for training elephants, which we may call respectively the tough and the gentle. The former method simply consists of setting an elephant to work and beating him until he does what is expe...

整除分块学习笔记

整除分块学习笔记 值域分段求和 假如我们要对这样的式子进行求和: \[\sum\limits_{i=1}^{n} f(i) \]如果 \(f(i)\) 的取值有限,只有 \(m\) 个,且对于所有的 \(f(i)=x\) 在序列中都是连续的一段,那么就可以进行值域分段求和。 找出每个取值 \(x\) 在原序列中的第一次出现的位…...

element时间选择器 选择当前时间和之后的时间

<el-form-item label"称号有效期&#xff1a;" prop"featureEndTime"><el-date-pickerv-model"formObj.featureEndTime"type"datetime"placeholder"选择日期"format"yyyy-MM-dd HH:mm:ss"value-format&q…...

LeetCode-二叉树遍历问题整理

本文整理了 LeetCode 上关于二叉树遍历的相关问题。 问题列表 144. 二叉树的前序遍历 94. 二叉树的中序遍历 145. 二叉树的后序遍历 102. 二叉树的层序遍历 889. 根据前序和后序遍历构造二叉树 105. 从前序与中序遍历序列构造二叉树 106. 从中序与后序遍历序列构造二叉…...

2021.8.23

写项目 画创建群的界面和查看好友资料界面 重新修改了一下好友列表的布局&#xff0c;增加显示查看好友资料&#xff0c;删除好友的按钮&#xff0c;还没有改好。。。。。。。。。。。。。。。 思考怎么实现表情包的发送...

HTML内置对象

目录 前言&#xff1a; 一、基本对象Object: 二、内置对象之Array&#xff1a; 三、内置对象之Math&#xff1a; 四、内置对象之Number&#xff1a; 五、内置对象之String&#xff1a; 六、内置对象之Date&#xff1a; 七、内置对象之JSON&#xff08;ES5新增内置对象&am…...

Vue2.x 源码 -slot

上一篇&#xff1a;Vue2.x 源码 - 异步组件 Vue 的组件提供了⼀个⾮常有⽤的特性 —— slot 插槽&#xff0c;它让组件的实现变的更加灵活。我们平时在 开发组件库的时候&#xff0c;为了让组件更加灵活可定制&#xff0c;经常⽤插槽的⽅式让⽤户可以⾃定义内容。 插槽分为&am…...

Nocas单机启动命令

之前在Linux中单机启动Nocas使用命令&#xff1a;sh startup.sh -m standalone 但是在cmd窗口使用该命令不行&#xff0c;因为sh命令是在Linux系统中的文件&#xff1b; 而在本机cmd窗口运行Nocas&#xff0c;输入命令startup.cmd -m standalone...

淘宝商品详情接口

有需要联系QQ&#xff1a;1195918027 简要描述 根据商品id获取详情数据 请求URL http://xxx.xxx.xxx.xxx:xxxx/taobao.shop.info 请求方式 get 请求参数 参数名必选类型说明itemid是string商品idtoken是string权限token 返回示例 {"api": "wdetail"…...

uboot启动第二阶段——C语言

1、给全局变量gd分配内存 详情参考&#xff1a;《uboot中重要的全局变量——gd》。 2、计算重定位的代码长度 _armboot_start:.word _startmonitor_flash_len _bss_start - _armboot_start; //要重定位的长度_bss_start 是bss段开始的地址&#xff0c;_armboot_start是整个程…...

SpringMVC配置拦截器后,启动项目500

ERROR org.springframework.web.servlet.DispatcherServlet - Context initialization failed org.springframework.beans.factory.BeanCreationException: Error creating bean with name org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMappi...

C++虚函数 一

C虚函数虚函数虚函数的作用虚函数的实现原理虚函数实现原理的验证虚函数 虚函数的作用 面向对象中一个非常重要的概念叫多态&#xff0c;指的是 使得一个基类指针指向一个派生类对象&#xff0c;当调用基类和派生类共有的函数时&#xff0c;最终调用的是派生类的函数。 如下 …...

从青铜到王者的路线,6年菜鸟开发面试字节跳动Android研发岗,移动架构师成长路线

前言 今天我给大家再次分享一下&#xff0c;我最近的一些读书的感想&#xff0c;思考起来&#xff0c;确实能够给自己带来一些真实的帮助和启发&#xff0c;希望大家在平时的工作学习中&#xff0c;也能够认清楚学习的一些本质。 如果我们的学习是在不断掌握应对具体工作场景…...

vue--CompositionAPI 中如何使用 VueX

a.同步方法改变数据&#xff1a; Home.vue <template><div class"home"><img alt"Vue logo" src"../assets/logo.png"><h1>{{name}}</h1></div> </template><script> import {toRefs} from v…...

html标签字符,在thymeleaf中非转义显示

html标签字符&#xff0c;在thymeleaf中非转义显示 对于“非转义文本”使用 th:utext th:utext"${lastAnnouncement.content}"th:text和 th:utext效果对比&#xff1a; <p><strong>This is my textarea to be replaced with CKEditor 4.</strong&g…...

在vue3中vue-router的使用

从vue2转到使用vue3&#xff0c;遇到了好多问题&#xff0c;原来使用的方法有很大不同。 1.安装vue-routernext npm install vue-routernext --save 2.创建名为“router”的文件夹&#xff0c;在创建index.js 3.编写index.js 首先引入vue-router插件&#xff0c;然后创建一个…...

js面向对象 —— 继承

二、继承 ES6之前并没有给我们提供extends继承。我们可以通过 构造函数原型对象 模拟实现继承,被称为组合继承。 2.1 、call() 调用这个函数并且修改函数运行时的this指向 ● thisArg :当前调用函数this的指向对象 ● arg1 , arg2 :传递的其他参数 2.2、借用构造函数继承父…...

Java List remove时报UnsupportedOperationException

遇到的问题&#xff1a; 解决后&#xff1a; 源代码&#xff1a; /*** 需求&#xff1a;删除字符串中的a8&#xff0c;并重新组成字符串* param args*/public static void main(String[] args) {String str "a3,a4,a5,a6,a8";String[] moIds str.split(StringPool.…...

【C++】实现D3D9 的 Inline hook

【C++】实现D3D9 的 Inline hook简单介绍一下HOOK原理:函数调用的过程大致是 先push 参数 进去,再执行 call 函数地址 ,进入函数。此时将所调用的函数的前五个字节修改,将开头改成 jmp xxxxxxxx(地址偏移) ,则可以进入自己的函数,执行自己函数的内容,执行完自己的函数后…...

C++ Protobuf

Protobuf protobuf (protocol buffer) 是谷歌内部的混合语言数据标准。通过将结构化的数据进行序列化(串行化),用于通讯协议、数据存储等领域的语言无关、平台无关、可扩展的序列化结构数据格式。序列化: 将结构数据或者对象转换成能够用于存储和传输的格式。反序列化: 在其…...

identity4 系列————纯js客户端案例篇[四]

前言 前面已经解释了两个案例了,通信原理其实已经很清楚了,那么纯js客户端是怎么处理的呢? 正文 直接贴例子哈。 https://github.com/IdentityServer/IdentityServer4/tree/main/samples/Quickstarts/4_JavaScriptClient那么解释一下其实怎么做的吧。 那么就直接来看这个jav…...

实现艾尔登法环中的大卢恩效果

使用顶点动画中的广告牌技术(Billboarding),实现简单的艾尔登法环中的大卢恩效果使用顶点动画中的广告牌技术(Billboarding),来实现大卢恩在竖直方向上保持始终朝向玩家的效果。 1、广告牌技术原理 广告牌技术会根据视角方向来旋转一个被纹理着色的多边形,通常用于渲染烟…...

图床搭建|chrome插件|操作简单不要钱

为什么需要一个图床 为了写博客 图床:专门用来存放图片,同时允许你把图片对外连接的网上空间. 用markdown格式写作,插入图片需要图片的url地址,然后博客的背景图也是要用url地址。 有段时间,我一直很想拥有一个自己的博客。这个博客既要足够简洁明了,又要有一定的观赏性。我…...

【面试题】如何去掉vue的url地址中的#号?及其原理?

如何去掉vue的url地址中的#号?及其原理? 点击打开视频讲解更加详细 如何去掉vue的url地址中的#号? import Vue from vue;import VueRouter from vue-router;Vue.use(VueRouter)// 1. 定义一些路由 // 每个路由都需要映射到一个组件。 const routes = [{ path: /home, compon…...

学习ASP.NET Core Blazor编程系列一——综述

一、NET 6概述.NET 6 是微软统一.Net Core与.Net Framework 两大框架的第二个版本,微软在 .NET 5 中开始进行这两大框架的统一之路。.NET 6 将作为长期支持 (LTS) 版本得到三年的支持。只有Visual Studio 2022(以及更高版本)支持 .NET 6。Visual Studio 2017/2019等版本都不…...

React报错之Parameter props implicitly has an any type

正文从这开始~ 总览 当我们没有为函数组件或者类组件的props声明类型,或忘记为React安装类型声明文件时,会产生"Parameter props implicitly has an any type"错误。为了解决这个错误,在你的组件中明确地为props对象设置一个类型。安装类型文件 你首先要确定的是你…...

(WebFlux)003、多数据源R2dbc事务失效分析

一、背景 最近项目持续改造,然后把SpringMVC换成了SpringWebflux,然后把Mybatis换成了R2dbc。中间没有遇到什么问题,一切都那么的美滋滋,直到最近一个新需求的出现,打破了往日的宁静。 在对需求分析了一番后,需要引入新的数据源,那就是MongoDb。然后出现了MongoDb、Mysq…...

对Github指定类目的内容进行监控和推送

很久之前看到HACK学习呀有一个Github 安全搬运工的系列文章,个人觉得很不错,想要在自己的公众号上也做这方面的内容,内容的编辑排版相对来说比较容易,这样问题就回归到Github安全内容的获取上 这篇文章整体比较长,如果想直接使用的话可以跳转去仓库 https://github.com/Cl…...

大数据数据仓库建设流程概述

数据仓库的逻辑分层架构&#xff1a; 想看懂数据仓库的逻辑分层架构&#xff0c;必须先弄懂以下4大概念。 数据源&#xff1a;数据来源&#xff0c;互联网公司的数据来源随着公司的规模扩张而呈递增趋势&#xff0c;同时自不同的业务源&#xff0c;比如埋点采集&#xff0c;客…...

干货|WMS仓库管理系统提高企业仓库管理效率(上)

在零售门店货架成本上升和配送周期要求越来越严格的双重压力下&#xff0c;企业的配送服务需要根据订单要求将正确的商品配送到正确的地点&#xff0c;还需要在商品数量齐全、配送及时、适应高频小订单趋势、帮助门店上架、价格有竞争力等方面下功夫。 此外&#xff0c;考虑到法…...

仓库进销存管理软件哪个好?中小企业管理软件特点描述

此前&#xff0c;在商品流通行业&#xff0c;中小企业的管理大多是手工记录&#xff0c;包括业务流程管理、财务核算等。由于很多中小企业规模小&#xff0c;人员有限&#xff0c;岗位职责划分混乱&#xff0c;往往一人兼任数职。而且他们的计算机水平通常较低&#xff0c;不会…...

干货|WMS仓库管理系统提高企业仓库管理效率(下)

在货架成本上升和交货周期要求日益严格的双重压力下&#xff0c;企业的配送服务需要根据订单要求将正确的商品送到正确的地点&#xff0c;还需要在产品规格齐全、交货及时、适应高频小订单趋势、帮助门店上架、价格有竞争力等方面下功夫。此外&#xff0c;考虑到法规和安全问题…...

erp管理规范

erp管理规范 ERP采用的基础技术将同时给用户软件和硬件两方面的独立性从而更加容易升级。ERP的关键在于所有用户能够裁剪其应用&#xff0c;因而具有天然的易用性。 Gartner Group提出ERP具备的功能标准应包括四个方面: 1.超越MRPⅡ范围的集成功能 包括质量管理;试验室管理…...

机械制造企业,如何借助ERP系统解决仓库管理难题?

机械制造行业生产所需物料数量大、种类繁多&#xff0c;采购及库存管理的控制环节也多。库存管理水平是企业整体管理的反映&#xff0c;而高效的仓储管理可以有效帮助企业降低成本。所以&#xff0c;企业要想进一步降低企业成本就必须要依据科学管理原则来对企业的生产及日常所…...

企业ERP管理系统功能分析

什么是erp管理系统&#xff1f; erp系统是集采购、销售、库存及应收处理一体化管理&#xff0c;广泛应用于多门店、多仓库的小型企业供应链。以系统化的管理思想&#xff0c;为企业员工及决策层提供决策手段的管理平台。其核心思想是供应链管理。它跳出了传统企业边界&#xf…...

Editor扩展常用API

如图 效果图 代码&#xff1a; using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEditor; public class Mybianyi : EditorWindow { string PasswordField ""; string m_textArea ""; float …...

计算机学院青年教师讲课,【教学动态】计算机科学与信息工程学院举办首届中青年教师讲课大赛...

原标题&#xff1a;【教学动态】计算机科学与信息工程学院举办首届中青年教师讲课大赛(王明华/文)为更好地迎接教育部审核评估工作以及调动学院广大中青年教师的教学积极性与教学热情&#xff0c;加强教师教学技能的培训力度&#xff0c;进一步提高中青年教师课堂教学实力与竞争…...

第九周任务四:建立二维数组类

* (程序头部注释开始) * 程序的版权和版本声明部分 * Copyright (c) 2011, 烟台大学计算机学院学生 * All rights reserved. * 文件名称&#xff1a; * 作者&#xff1a;吴瑕 * 完成日期&#xff1a; 2012年 04月 17日 * 版本号&#xff1a; *对任务及求解方法的描述部…...

十四周报告一

(程序头部注释开始) * 程序的版权和版本声明部分 * Copyright (c) 2011, 烟台大学计算机学院学生 * All rights reserved. * 文件名称&#xff1a; * 作者&#xff1a;吴瑕 * 完成日期&#xff1a; 2012年 05月 15日 * 版本号&#xff1a; *对任务及求解方法的描述部分…...

第八周任务三:实现分数类中的运算符重载

* (程序头部注释开始) * 程序的版权和版本声明部分 * Copyright (c) 2011, 烟台大学计算机学院学生 * All rights reserved. * 文件名称&#xff1a; * 作者&#xff1a;吴瑕 * 完成日期&#xff1a; 2012年 04月 03日 * 版本号&#xff1a; *对任务及求解方法的描述部分 * 输入…...

第八周任务二:实现Time 类中的运算符重载

* (程序头部注释开始) * 程序的版权和版本声明部分 * Copyright (c) 2011, 烟台大学计算机学院学生 * All rights reserved. * 文件名称&#xff1a; * 作者&#xff1a;吴瑕 * 完成日期&#xff1a; 2012年 04月 10日 * 版本号&#xff1a; *对任务及求解方法的描述部分 * 输入…...

第八周任务一:运算符的重载

* (程序头部注释开始) * 程序的版权和版本声明部分 * Copyright (c) 2011, 烟台大学计算机学院学生 * All rights reserved. * 文件名称&#xff1a; * 作者&#xff1a;吴瑕 * 完成日期&#xff1a; 2012年 04月 03日 * 版本号&#xff1a; *对任务及求解方法的描述部分 * 输入…...

第九周任务二:CTime类的扩展

* (程序头部注释开始) * 程序的版权和版本声明部分 * Copyright (c) 2011, 烟台大学计算机学院学生 * All rights reserved. * 文件名称&#xff1a; * 作者&#xff1a;吴瑕 * 完成日期&#xff1a; 2012年 04月16日 * 版本号&#xff1a; *对任务及求解方法的描述部分…...

十二周报告三

* (程序头部注释开始) * 程序的版权和版本声明部分 * Copyright (c) 2011, 烟台大学计算机学院学生 * All rights reserved. * 文件名称&#xff1a; * 作者&#xff1a;吴瑕 * 完成日期&#xff1a; 2012年 05月 08日 * 版本号&#xff1a; *对任务及求解方法的描述部…...

第十二周报告四

* (程序头部注释开始) * 程序的版权和版本声明部分 * Copyright (c) 2011, 烟台大学计算机学院学生 * All rights reserved. * 文件名称&#xff1a; * 作者&#xff1a;吴瑕 * 完成日期&#xff1a; 2012年 05月 08日 * 版本号&#xff1a; *对任务及求解方法的描述部…...

十三周报告二

(程序头部注释开始) * 程序的版权和版本声明部分 * Copyright (c) 2011, 烟台大学计算机学院学生 * All rights reserved. * 文件名称&#xff1a; * 作者&#xff1a;吴瑕 * 完成日期&#xff1a; 2012年 05月 13日 * 版本号&#xff1a; *对任务及求解方法的描述部分…...

萌宠过春节成消费新热点 广西宠物寄养一“窝”难求

中新社柳州1月31日电 题&#xff1a;萌宠过春节成消费新热点 广西宠物寄养一“窝”难求 作者 林馨 钟建珊1月8日&#xff0c;广西南宁一室内动物观赏乐园内&#xff0c;饲养员与动物亲密互动。中新社记者 俞靖 摄 “新的一年&#xff0c;希望猫狗双全。”时下&#xff0c;“猫…...

SDNU OJ 1182 奖学金

先来贴一个地址&#xff1a;http://www.acmicpc.sdnu.edu.cn/problem/show/1182 题目名字已列在标题上。下面贴一下原题&#xff1a; 描述&#xff1a; 某小学最近得到了一笔赞助&#xff0c;打算拿出其中一部分为学习成绩优秀的前5名学生发奖学金。期末&#xff0c;每个学生…...