2010-11-19

java.util.concurrent 多线程框架实例

JDK5中的一个亮点就是将Doug Lea的并发库引入到Java标准库中。Doug Lea确实是一个牛人,能教书,能出书,能编码,不过这在国外还是比较普遍的,而国内的教授们就相差太远了。

一般的服务器都需要线程池,比如Web、FTP等服务器,不过它们一般都自己实现了线程池,比如以前介绍过的Tomcat、Resin和Jetty等,现在有了JDK5,我们就没有必要重复造车轮了,直接使用就可以,何况使用也很方便,性能也非常高。

 package concurrent; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; public class TestThreadPool { public static void main(String args[]) throws InterruptedException { // only two threads ExecutorService exec = Executors.newFixedThreadPool(2); for(int index = 0; index < 100; index++) { Runnable run = new Runnable() { public void run() { long time = (long) (Math.random() * 1000); System.out.println("Sleeping " + time + "ms"); try { Thread.sleep(time); } catch (InterruptedException e) { } } }; exec.execute(run); } // must shutdown exec.shutdown(); } }

上面是一个简单的例子,使用了2个大小的线程池来处理100个线程。但有一个问题:在for循环的过程中,会等待线程池有空闲的线程,所以主线程会阻塞的。为了解决这个问题,一般启动一个线程来做for循环,就是为了避免由于线程池满了造成主线程阻塞。不过在这里我没有这样处理。[重要修正:经过测试,即使线程池大小小于实际线程数大小,线程池也不会阻塞的,这与Tomcat的线程池不同,它将Runnable实例放到一个"无限"的BlockingQueue中,所以就不用一个线程启动for循环,Doug Lea果然厉害]

另外它使用了Executors的静态函数生成一个固定的线程池,顾名思义,线程池的线程是不会释放的,即使它是Idle。这就会产生性能问题,比如如果线程池的大小为200,当全部使用完毕后,所有的线程会继续留在池中,相应的内存和线程切换(while(true)+sleep循环)都会增加。如果要避免这个问题,就必须直接使用ThreadPoolExecutor()来构造。可以像Tomcat的线程池一样设置"最大线程数"、"最小线程数"和"空闲线程keepAlive的时间"。通过这些可以基本上替换Tomcat的线程池实现方案。

需要注意的是线程池必须使用shutdown来显式关闭,否则主线程就无法退出。shutdown也不会阻塞主线程。

许多长时间运行的应用有时候需要定时运行任务完成一些诸如统计、优化等工作,比如在电信行业中处理用户话单时,需要每隔1分钟处理话单;网站每天凌晨统计用户访问量、用户数;大型超时凌晨3点统计当天销售额、以及最热卖的商品;每周日进行数据库备份;公司每个月的10号计算工资并进行转帐等,这些都是定时任务。通过 java的并发库concurrent可以轻松的完成这些任务,而且非常的简单。

 package concurrent; import static java.util.concurrent.TimeUnit.SECONDS; import java.util.Date; import java.util.concurrent.Executors; import java.util.concurrent.ScheduledExecutorService; import java.util.concurrent.ScheduledFuture; public class TestScheduledThread { public static void main(String[] args) { final ScheduledExecutorService scheduler = Executors .newScheduledThreadPool(2); final Runnable beeper = new Runnable() { int count = 0; public void run() { System.out.println(new Date() + " beep " + (++count)); } }; // 1秒钟后运行,并每隔2秒运行一次 final ScheduledFuture beeperHandle = scheduler.scheduleAtFixedRate( beeper, 1, 2, SECONDS); // 2秒钟后运行,并每次在上次任务运行完后等待5秒后重新运行 final ScheduledFuture beeperHandle2 = scheduler .scheduleWithFixedDelay(beeper, 2, 5, SECONDS); // 30秒后结束关闭任务,并且关闭Scheduler scheduler.schedule(new Runnable() { public void run() { beeperHandle.cancel(true); beeperHandle2.cancel(true); scheduler.shutdown(); } }, 30, SECONDS); } }

为了退出进程,上面的代码中加入了关闭Scheduler的操作。而对于24小时运行的应用而言,是没有必要关闭Scheduler的。

在实际应用中,有时候需要多个线程同时工作以完成同一件事情,而且在完成过程中,往往会等待其他线程都完成某一阶段后再执行,等所有线程都到达某一个阶段后再统一执行。

比如有几个旅行团需要途经深圳、广州、韶关、长沙最后到达武汉。旅行团中有自驾游的,有徒步的,有乘坐旅游大巴的;这些旅行团同时出发,并且每到一个目的地,都要等待其他旅行团到达此地后再同时出发,直到都到达终点站武汉。

这时候CyclicBarrier就可以派上用场。CyclicBarrier最重要的属性就是参与者个数,另外最要方法是await()。当所有线程都调用了await()后,就表示这些线程都可以继续执行,否则就会等待。

 package concurrent; import java.text.SimpleDateFormat; import java.util.Date; import java.util.concurrent.BrokenBarrierException; import java.util.concurrent.CyclicBarrier; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; public class TestCyclicBarrier { // 徒步需要的时间: Shenzhen, Guangzhou, Shaoguan, Changsha, Wuhan private static int[] timeWalk = { 5, 8, 15, 15, 10 }; // 自驾游 private static int[] timeSelf = { 1, 3, 4, 4, 5 }; // 旅游大巴 private static int[] timeBus = { 2, 4, 6, 6, 7 };  static String now() { SimpleDateFormat sdf = new SimpleDateFormat("HH:mm:ss"); return sdf.format(new Date()) + ": "; }  static class Tour implements Runnable { private int[] times; private CyclicBarrier barrier; private String tourName; public Tour(CyclicBarrier barrier, String tourName, int[] times) { this.times = times; this.tourName = tourName; this.barrier = barrier; } public void run() { try { Thread.sleep(times[0] * 1000); System.out.println(now() + tourName + " Reached Shenzhen"); barrier.await(); Thread.sleep(times[1] * 1000); System.out.println(now() + tourName + " Reached Guangzhou"); barrier.await(); Thread.sleep(times[2] * 1000); System.out.println(now() + tourName + " Reached Shaoguan"); barrier.await(); Thread.sleep(times[3] * 1000); System.out.println(now() + tourName + " Reached Changsha"); barrier.await(); Thread.sleep(times[4] * 1000); System.out.println(now() + tourName + " Reached Wuhan"); barrier.await(); } catch (InterruptedException e) { } catch (BrokenBarrierException e) { } } }  public static void main(String[] args) { // 三个旅行团 CyclicBarrier barrier = new CyclicBarrier(3); ExecutorService exec = Executors.newFixedThreadPool(3); exec.submit(new Tour(barrier, "WalkTour", timeWalk)); exec.submit(new Tour(barrier, "SelfTour", timeSelf)); exec.submit(new Tour(barrier, "BusTour", timeBus)); exec.shutdown(); } }

运行结果:

00:02:25: SelfTour Reached Shenzhen

00:02:25: BusTour Reached Shenzhen

00:02:27: WalkTour Reached Shenzhen

00:02:30: SelfTour Reached Guangzhou

00:02:31: BusTour Reached Guangzhou

00:02:35: WalkTour Reached Guangzhou

00:02:39: SelfTour Reached Shaoguan

00:02:41: BusTour Reached Shaoguan

并发库中的BlockingQueue是一个比较好玩的类,顾名思义,就是阻塞队列。该类主要提供了两个方法put()和take(),前者将一个对象放到队列中,如果队列已经满了,就等待直到有空闲节点;后者从head取一个对象,如果没有对象,就等待直到有可取的对象。

下面的例子比较简单,一个读线程,用于将要处理的文件对象添加到阻塞队列中,另外四个写线程用于取出文件对象,为了模拟写操作耗时长的特点,特让线程睡眠一段随机长度的时间。另外,该Demo也使用到了线程池和原子整型(AtomicInteger),AtomicInteger可以在并发情况下达到原子化更新,避免使用了synchronized,而且性能非常高。由于阻塞队列的put和take操作会阻塞,为了使线程退出,特在队列中添加了一个"标识",算法中也叫"哨兵",当发现这个哨兵后,写线程就退出。

当然线程池也要显式退出了。

 package concurrent; import java.io.File; import java.io.FileFilter; import java.util.concurrent.BlockingQueue; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concurrent.LinkedBlockingQueue; import java.util.concurrent.atomic.AtomicInteger;  public class TestBlockingQueue { static long randomTime() { return (long) (Math.random() * 1000); }  public static void main(String[] args) { // 能容纳100个文件 final BlockingQueue queue = new LinkedBlockingQueue(100); // 线程池 final ExecutorService exec = Executors.newFixedThreadPool(5); final File root = new File("F:\\JavaLib"); // 完成标志 final File exitFile = new File(""); // 读个数 final AtomicInteger rc = new AtomicInteger(); // 写个数 final AtomicInteger wc = new AtomicInteger(); // 读线程 Runnable read = new Runnable() { public void run() { scanFile(root); scanFile(exitFile); }  public void scanFile(File file) { if (file.isDirectory()) { File[] files = file.listFiles(new FileFilter() { public boolean accept(File pathname) { return pathname.isDirectory() || pathname.getPath().endsWith(".java"); } }); for (File one : files) scanFile(one); } else { try { int index = rc.incrementAndGet(); System.out.println("Read0: " + index + " " + file.getPath()); queue.put(file); } catch (InterruptedException e) { } } } }; exec.submit(read); // 四个写线程 for (int index = 0; index < 4; index++) { // write thread final int NO = index; Runnable write = new Runnable() { String threadName = "Write" + NO; public void run() { while (true) { try { Thread.sleep(randomTime()); int index = wc.incrementAndGet(); File file = queue.take(); // 队列已经无对象 if (file == exitFile) { // 再次添加"标志",以让其他线程正常退出 queue.put(exitFile); break; } System.out.println(threadName + ": " + index + " " + file.getPath()); } catch (InterruptedException e) { } } } }; exec.submit(write); } exec.shutdown(); } }

从名字可以看出,CountDownLatch是一个倒数计数的锁,当倒数到0时触发事件,也就是开锁,其他人就可以进入了。在一些应用场合中,需要等待某个条件达到要求后才能做后面的事情;同时当线程都完成后也会触发事件,以便进行后面的操作。

CountDownLatch最重要的方法是countDown()和await(),前者主要是倒数一次,后者是等待倒数到0,如果没有到达0,就只有阻塞等待了。

一个CountDouwnLatch实例是不能重复使用的,也就是说它是一次性的,锁一经被打开就不能再关闭使用了,如果想重复使用,请考虑使用CyclicBarrier。

下面的例子简单的说明了CountDownLatch的使用方法,模拟了100米赛跑,10名选手已经准备就绪,只等裁判一声令下。当所有人都到达终点时,比赛结束

同样,线程池需要显式shutdown。

 package concurrent;  import java.util.concurrent.CountDownLatch; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors;  public class TestCountDownLatch { public static void main(String[] args) throws InterruptedException { // 开始的倒数锁 final CountDownLatch begin = new CountDownLatch(1); // 结束的倒数锁 final CountDownLatch end = new CountDownLatch(10); // 十名选手 final ExecutorService exec = Executors.newFixedThreadPool(10); for(int index = 0; index < 10; index++) { final int NO = index + 1; Runnable run = new Runnable(){ public void run() { try { begin.await(); Thread.sleep((long) (Math.random() * 10000)); System.out.println("No." + NO + " arrived"); } catch (InterruptedException e) { } finally { end.countDown(); } } }; exec.submit(run); } System.out.println("Game Start"); begin.countDown(); end.await(); System.out.println("Game Over"); exec.shutdown(); } }

运行结果:

Game Start

No.4 arrived

No.1 arrived

No.7 arrived

No.9 arrived

No.3 arrived

No.2 arrived

No.8 arrived

No.10 arrived

No.6 arrived

No.5 arrived

Game Over

有时候在实际应用中,某些操作很耗时,但又不是不可或缺的步骤。比如用网页浏览器浏览新闻时,最重要的是要显示文字内容,至于与新闻相匹配的图片就没有那么重要的,所以此时首先保证文字信息先显示,而图片信息会后显示,但又不能不显示,由于下载图片是一个耗时的操作,所以必须一开始就得下载。

Java的并发库的Future类就可以满足这个要求。Future的重要方法包括get()和cancel(),get()获取数据对象,如果数据没有加载,就会阻塞直到取到数据,而 cancel()是取消数据加载。另外一个get(timeout)操作,表示如果在timeout时间内没有取到就失败返回,而不再阻塞。

下面的Demo简单的说明了Future的使用方法:一个非常耗时的操作必须一开始启动,但又不能一直等待;其他重要的事情又必须做,等完成后,就可以做不重要的事情。

 package concurrent;  import java.util.concurrent.Callable; import java.util.concurrent.ExecutionException; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concurrent.Future;  public class TestFutureTask { public static void main(String[] args)throws InterruptedException, ExecutionException { final ExecutorService exec = Executors.newFixedThreadPool(5); Callable call = new Callable() { public String call() throws Exception { Thread.sleep(1000 * 5); return "Other less important but longtime things."; } }; Future task = exec.submit(call); // 重要的事情 Thread.sleep(1000 * 3); System.out.println("Let's do important things."); // 其他不重要的事情 String obj = task.get(); System.out.println(obj); // 关闭线程池 exec.shutdown(); } }

运行结果:

Let's do important things.

Other less important but longtime things.

考虑以下场景:浏览网页时,浏览器了5个线程下载网页中的图片文件,由于图片大小、网站访问速度等诸多因素的影响,完成图片下载的时间就会有很大的不同。如果先下载完成的图片就会被先显示到界面上,反之,后下载的图片就后显示。

Java的并发库的CompletionService可以满足这种场景要求。该接口有两个重要方法:submit()和take()。submit用于提交一个runnable或者callable,一般会提交给一个线程池处理;而take就是取出已经执行完毕runnable或者callable实例的Future对象,如果没有满足要求的,就等待了。 CompletionService还有一个对应的方法poll,该方法与take类似,只是不会等待,如果没有满足要求,就返回null对象。

 package concurrent;  import java.util.concurrent.Callable; import java.util.concurrent.CompletionService; import java.util.concurrent.ExecutionException; import java.util.concurrent.ExecutorCompletionService; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concurrent.Future;  public class TestCompletionService { public static void main(String[] args) throws InterruptedException, ExecutionException { ExecutorService exec = Executors.newFixedThreadPool(10); CompletionService serv = new ExecutorCompletionService(exec);  for (int index = 0; index < 5; index++) { final int NO = index; Callable downImg = new Callable() { public String call() throws Exception { Thread.sleep((long) (Math.random() * 10000)); return "Downloaded Image " + NO; } }; serv.submit(downImg); }  Thread.sleep(1000 * 2); System.out.println("Show web content"); for (int index = 0; index < 5; index++) { Future task = serv.take(); String img = task.get(); System.out.println(img); } System.out.println("End"); // 关闭线程池 exec.shutdown(); } }

运行结果:

Show web content

Downloaded Image 1

Downloaded Image 2

Downloaded Image 4

Downloaded Image 0

Downloaded Image 3

End

操作系统的信号量是个很重要的概念,在进程控制方面都有应用。Java并发库的Semaphore可以很轻松完成信号量控制,Semaphore可以控制某个资源可被同时访问的个数,acquire()获取一个许可,如果没有就等待,而release()释放一个许可。比如在Windows下可以设置共享文件的最大客户端访问个数。

Semaphore维护了当前访问的个数,提供同步机制,控制同时访问的个数。在数据结构中链表可以保存"无限"的节点,用Semaphore可以实现有限大小的链表。另外重入锁ReentrantLock也可以实现该功能,但实现上要负责些,代码也要复杂些。

下面的Demo中申明了一个只有5个许可的Semaphore,而有20个线程要访问这个资源,通过acquire()和release()获取和释放访问许可

 package concurrent;  import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concurrent.Semaphore;  public class TestSemaphore { public static void main(String[] args) { // 线程池 ExecutorService exec = Executors.newCachedThreadPool(); // 只能5个线程同时访问 final Semaphore semp = new Semaphore(5); // 模拟20个客户端访问 for (int index = 0; index < 20; index++) { final int NO = index; Runnable run = new Runnable() { public void run() { try { // 获取许可 semp.acquire(); System.out.println("Accessing: " + NO); Thread.sleep((long) (Math.random() * 10000)); // 访问完后,释放 semp.release(); } catch (InterruptedException e) { } } }; exec.execute(run); } // 退出线程池 exec.shutdown(); } }

运行结果:

Accessing: 0

Accessing: 1

Accessing: 2

Accessing: 3

Accessing: 4

Accessing: 5

Accessing: 6

Accessing: 7

Accessing: 8

Accessing: 9

Accessing: 10

Accessing: 11

Accessing: 12

Accessing: 13

Accessing: 14

Accessing: 15

Accessing: 16

Accessing: 17

Accessing: 18

Accessing: 19


--
we drink green tea

2010-11-17

山东2006年会计从业资格考试《会计基础》试题及答案

11.单位未设立档案机构的,应当在单位会计机构内部指定专人保管会计档案,但出纳人员不得兼管会计档案。()

12.资产负债表是反映企业在一定时期内财务状况的报表。()

13.现金清查中查明的现金短款,如果属于无法查明的其他原因,报经审批后应列作营业外支出。()

14.原材料明细账的每一账页登记完毕结转下页时,可以只将每页末的余额结转次页,不必将本页的发生额结转次页。()

15.根据账户记录编制试算平衡表,如果所有账户的借方发生额合计同所有账户的贷方发生额合计相等,也不能肯定账户记录一定无误。()

16."累计折旧"、"坏账准备"等反映资产的价值损耗或损失的账户,属于资产类账户。()

17.汇总记账凭证账务处理程序适用于经营规模较大、转账业务事项较多而收、付款业务事项较少的单位。()

18.单位对固定资产按历史成本计价,并采用折旧的方法对其在各个会计期间进行分摊,这是以会计分期为前提的。()

19.自制原始凭证是单位会计人员自行填制的原始凭证。()

20.企业承担的现时义务,如果预期不会导致经济利益流出企业,则不为确认为负债。()

11√

12×

13×

14×

15√

16√

17×

18√

19×

20√


--
we drink green tea

汇总记账凭证账务处理程序

汇总记账凭证账务处理程序,是从记账凭证账务处理程序发展演变而来的。这种账务处理程序的主要特点,是先根据记账凭证填制汇总记账凭证,再根据汇总记账凭证登记总分类账。
  该账务处理程序的基本流程为:

采用这种账务处理程序需要设置的账簿,主要有:现金日记账、银行存款日记账、总分类账和明细分类账。汇总记账凭证的格式受记账凭证格式的影响,既可使用一种统一的汇总凭证,也可使用汇总收款凭证、汇总付款凭证和汇总转账凭证。
  采用汇总记账凭证账务处理程序,由于总分类账是根据汇总记账凭证登记的,因此简化了登记总分类账的工作量。同时,收款凭证以借方科目为主,按照对应的贷方科目进行汇总;付款凭证和转账凭证以贷方科目为主,按照对应的借方科目进行汇总,使凭证的整理归类工作比较简便,并能保证数字正确无误。所以这种账务处理程序一般适用于规模较大,业务较多的企业,但这种账务处理程序的缺点主要是总分类账的记录比较简略,难以具体反映企业的经济活动。
 在汇总记账凭证账务处理程序下,关键是编制汇总记账凭证。为了便于编制汇总记账凭证,必须注意以下几点:
  1. 汇总收款凭证,应只以"现金"和"银行存款"账户的借方设置,并只以相应的贷方科目归类汇总。汇总付款凭证,应按"现金"和"银行存款"账户的贷方设置,并按相应的借方科目归类汇总。
  2. 在编制时,应当注意对现金和银行存款之间相互划转的业务,如果同时填制收款、付款凭证的,应以付款凭证为据。例如:以现金存入银行,应根据现金付款凭证编制;从银行提取现金,应根据银行存款付款凭证编制。
  3. 汇总收款凭证和汇总付款凭证都要定期(一般为每隔五天或十天)填列,每月填制一张。月终,根据现金、银行存款汇总收款凭证的合计数,分别记入总分类账户现金和银行存款账户的借方,以及各个对应账户的贷方;根据现金、银行存款汇总付款凭证的合计数,分别记入总分类账户现金、银行存款账户的贷方,以及各个对应账户的借方。 
  4. 汇总转账凭证,在习惯上一般都按每一科目的贷方分别设置,并根据 转账凭证汇总其对应的借方科目。汇总转账凭证定期汇总填列一次,每月填制一张。
  为了便于填制汇总转账凭证,平时填制转账凭证时只能一贷多借,不能一借多贷。月终,根据汇总转账凭证的合计数分别记入总分类账中各个借方账户的借方以及该汇总凭证所列的贷方账户的贷方。如果在月份内某一贷方科目的转账凭证为数不多时,也可不编制汇总转账凭证,直接根据转账凭证记入总分类账。


--
we drink green tea

自制原始凭证

自制原始凭证,又简称自制凭证,是指由本单位内部经办业务的部门或个人(包括财会部门本身)在执行或完成某项经济业务时所填制的原始凭证。常见的自制原始凭证有:企业仓库部门填制的"材料验收单"、"产品入库验收单"、"销售发货票"、"发出材料汇总表",生产车间及其他部门申请领料时填制的"领料单",企业职工出差向单位借款填制的"借支单",以及财会部门编制的"工资费用结算单"、"制造费用分配表"等等。

--
we drink green tea

坏账准备账户为什么是资产类账户?

 坏账准备虽然它的记账规则是贷方增加,借方减少,但它仍然是资产类账户,它同累计折旧等科目一样,是备低类科目,是对应收账款和其它应收款的余额进行减少的科目。在资产负债表中没有它的项目,在应收账款报表项目金额中,已经将坏账准备减掉了。

 资产类账户按照反映流动性快慢的不同可以再分为流动资产类账户和非流动资产类账户。

  流动资产类账户主要有:现金、银行存款、短期投资、应收账款、原材料、库存商品、待摊费用等;

  非流动资产类账户主要有:长期投资、固定资产、累计折旧、无形资产、长期待摊费用等。

--
we drink green tea

建账、结账的常识

1、新公司成立要建哪些账本?

(一)建账应按照会计制度规定,根据企业具体行业要求,确定帐簿种类、格式、内容及登记方法。按照规定需要设置的会计帐簿有:总帐、明细帐、日记帐等。

(二)总帐一般采用"订本式帐簿"。 
总帐格式主要:三栏式。 
总帐开设:是根据"一级会计科目"开设的,用以提供资产、负债、所有者权益、费用、收入和利润等的总括的核算资料。 
总帐登记依据:是根据每月"计帐凭证汇总表"记帐的。

(三)明细帐一般采用"活页式"帐页。 
明细帐开设依据:通常根据总帐科目所属的明细科目设置的。 
明细帐格式主要有:三栏式、数量金额式和多栏式。 
明细帐记帐依据:按每月发生的业务,先后顺序编制计帐凭证,根据"计帐凭证"登记明细分类帐。 
明细帐使用的格式:(1)通常管理费用、营业费用等采用"多栏式"帐页记帐;(2)固定资产明细帐、库存商品明细帐等采用"数量金额式"帐页记帐。(3)应收账款、应付账款、其他应交款、其他应收款、营业收入、营业成本、营业税金及附加等采用"三栏式"帐页记帐。(4) 应交税金、管理费用等采用"多栏式"帐页记帐。

(四)日记帐又称"序时帐",现金日记帐和银行存款日记帐。 
1、现金日记帐和银行存款日记帐,使用"订本式帐簿",格式一般采用三栏式。 
2、现金日记帐:是用来登记库存现金每日的收入、支出和结存情况的帐簿。 
3、银行存款日记帐:是用来反映银行存款增加、减少和结存情况的帐簿

2、年底结帐的方法?

年度终了,要将各账户的余额结转到下一会计年度, 对于怎样把有余额的账户余额结转至下年,正确的方法应该是:年度终了时,有余额的账户的余额,直接记人新账余额栏内即可,不需要编制记账凭证,也不必将余额再记入本年账户的借方或贷方(收方或付方),使本年有余额账户变为零。

(1)结账前,必须将本期内所发生的各项经济业务全部登记入账。 
(2)结账时,应当结出每个账户的期末余额。
需要结出当月发生额的,应当在摘要栏内注明"本月合计"字样,并在下面通栏划单红线。
需要结出本年累计发生额的,应当在摘要栏内注明"本年累计"字样,并在下面通栏划单红线,12月末的"本年累计"就是全年累计发生额,全年累计发生额下应当通栏划双红线,年度终了结账时,所有总账账户都应当结出全年发生额和年末余额。 
(3)年度终了,要把各账户的余额结转到下一会计年度,并在摘要栏注明"结转下年"字样,在"结转下年"字样下空格处,从右上角至左下角划一条斜线注销;在下一会计年度新建有关会计账簿的第一余额栏内填写上年结转的余额,并在摘要栏注明"上年结转"字样。

3、过次页、承前页的规定?

按照《会计登帐规范》第六十条规定: 
"每一帐页登记完毕结转下页时,应当结出本页合计数及余额,写在本页最后一行和下页第一行有关栏内,并在摘要栏内注明'过次页'和'承前页'字样;也可以将本页合计数及金额只写在下页第一行有关栏内,并在摘要栏内注明'承前页'字样。"也就是说,"过次页"和"承前页"的方法有两种:一是在本页最后一行内结出发生额合计数及余额,然后过次页并在次页第一行承前页;二是只在次页第一行承前页写出发生额合计数及余额,不在上页最后一行结出发生额合计数及余额后过次页。

《规范》第六十条还对"过次页"的本页合计数的结计方法,根据不同需要作了规定:

(1)"对需要结计本月发生额的帐户,结计'过次页'的本页合计数应当为自本月初起至本页末止的发生额合计数",这样做,便于根据"过次页"的合计数,随时了解本月初到本页末止的发生额,也便于月末结帐时,加计"本月合计"数。     
(2)"对需要结计本年累计发生额的帐户,结计'过次页'的本页合计数应当为自年初起至本页末止的累计数",这样做,便于根据"过次页"的合计数,随时了解本年初到本页末止的累计发生额,也便于年终结帐时,加计"本年累计"数。 
(3)"对既不需要结计本月发生额也不需要结计本年累计发生额的帐户,可以只将每页末的余额结转次页",如某些材料明细帐户就没有必要将每页的发生额结转次页。

4、期末结账的规范记法?

(1)现金、银行存款日记账。
应按日结出余额,日结可自然进行,既可逐笔结余额,也可每隔五笔结一次余额,每日的最后一笔应自然结出当日余额,不必另起一行。有的会计在进行现金账日结时,总是另起一行,摘要栏内写"本日合计"同时结出本日收入合计、支出合计及余额。这样做当然可行,只是一个月要另起一行写出三十几个"本日合计",既占篇幅,又没必要。
现金、银行存款日记账的月结方法。即在本月最后一笔记录下面划一条通栏单红线,并在下一行的摘要栏中用红字居中书写"本月合计",同时在该行结出本月发生额合计及余额,然后,在"本月合计"行下面再划一条通栏单红线。


(2)明细账的结账方法。
若某一明细账的笔数较多,即业务量较大,平时可每隔五天(或每隔五笔)结一次余额。明细账在月结时应区别以下几种情况:(1)本月没有发生额的账户,不必进行月结(不画结账线);(2)不需按月结计本月发生额的账户,如各项应收、应付款及各项财产物资明细账等,在月末结出余额后,只需在本月最后一笔记录下面画一条通栏单红红,表示"本月记录到此结束";(3)对需要按月结计本月发生额的账户,如库存商品、应交税金、生产成本、制造费用及各"损益类"明细账等,因报表须填本月发生额,都要结计"本月合计"发生额及余额,并在"本月合计"字样下划一条通栏单红线。(4)需要结计本年累计发生额的账户,按月结出本年累计发生额,在"本月合计"字样下划一条通栏单红线后,下面一行摘要栏再注明"本年累计",并结出本季或全年发生额及余额,在下面再画一条通栏单红线。


(3)总账的结账方法。
业务较多的总账账户,平时也可每隔五天结一次余额,月末结出月末余额,一般月末可不结计"本月合计",结出月末余额后,只需在本月最后一笔记录下面画一条通栏单红线;表示"本月记录到此结束"。但若是需要结计"本月合计"及本年累计发生额的账户,其结账方法与上述明细账所述结账方法相同。

(4)结转下年的方法。
结转下年时,凡是有余额的账户,都应在年末划通栏双红线,并在通栏双红线下面摘要栏居中红字注明"结转下年"字样,不需作记账凭证,但必须把年末余额转入下年新账。转入下年新账时,应在账页第一笔空格摘要栏内居中红字注明"上年转来",并在余额栏内填写上年结转余额。


(5)结计"过次页"发生额的方法。
结计"过次页"的发生额,要根据不同账户记录采用不同的方法。(1)对需要按月结计本月发生额的账户,结计"过次页"的合计数,应是从本月初至本页末止的发生额的合计数,这样做便于本月结账时加计"本月合计"数。(2)对需要结计"本年累计发生额"的账户,结计"过次页"的本页合计数,应是从年初起至本页末止的累计数,这样做便于年终结账时加计"本年累计"数。结计"过次页"的数之后,在下一页第一笔空格摘要栏内居中红字注明"承前页"字样,并在发生额或余额栏内填写上页结转数。

5.实务结账:

一、结账的一般程序

结账,是在把一定时期内发生的全部经济业务登记入账的基础上,计算并记录本期发生额和期末余额。《会计基础工作规范》规定的结账程序及方法是:

程序为:经济业务全部登记入账结出每个账户期末余额写上"本月合计"并划通栏红线写上"本年累计"并划通栏红线(如果是年底的,在"本年累计"下再划一条通栏红线写上"结转下年")括号内为年底需做。

二、结账的具体方法

第一种方法:
平时:每次记账以后,都要随时结出余额,每月最后一笔余额即为月末余额。也就是说,月末余额就是本月最后一笔经济业务记录的同一行内的余额。月末结账时,只需要在最后一笔经济业务记录之下划一单红线,不需要再结计一次余额。
年底:应再划一条红线,表明当年业务结束。并在下一行的摘要写上"结转下年"

这种方法适用于:
A资产类:应收账款、预付账款、其他应收款、待摊费用、固定资产、累计折旧、无形资产、在建工程、长期待摊费用等大部分登记于三栏式明细账的科目。

B负债及所有者权益类:
应付账款、预收账款、其他应付款、短期借款、预提费用、应付票据、实收资本、资本公积、利润分配等大部分登记于三栏式明细账的科目。

C总账资产类、负债类、所有者权益类的总账科目。(有时总账的相关会被要求在年底统计出全年的发生额,如有需要的,只需在年底最后一笔的下面摘要栏写上"本年累计"并在借方、贷方金额写上累计发生额)

第二种方法:
平时:1、结出每个账户的期末余额,并结出当月发生额的,在摘要栏内注明"本月合计"字样,并在下面通栏划单红线。2、结出本年累计发生额的,在摘要栏内注明"本年累计"字样,并在下面通栏划单红线。
年底:"本年累计"就是全年累计发生额,全年累计发生额下应当通栏划双红线,表明当年结束。并在下一行的摘要写上"结转下年"

这种方法适用于:

A成本类、损益类总账科目

B成本类明细科目、损益类明细科目

C现金、银行存款科目;原材料、包装物、低值易耗品、库存商品等材料、商品类科目。

说明:月结划单线,年结划双线。划线时,应划红线;划线应划通栏线。


--
we drink green tea

企业现金清查中,经检查仍无法查明原因的现金短款,经批准后应计入

企业现金清查中,经检查仍无法查明原因的现金短款,经批准后应计入?

 企业现金清查中,经检查仍无法查明原因的现金短款,经批准后应计入(   ) A. 财务费用    B. 管理费用    C. 营业费用    D.营业外支出 

最佳答案
 B 相关会计分录为: 借:待处理财产损益-待处理流动资产损益    贷:现金 借:管理费用    贷:待处理财产损益-待处理流动资产损益 

--
we drink green tea

资产负债表是反映某一时期企业财务状况的静态报表

 错。资产负债表是反映企业在某一特定日期财务状况的报表。由于它反映的是某一时点的情况,所以,又称为静态报表。 时期:是指发展过程中的一段时间。它是个期间概念,而不是一个时点

--
we drink green tea

山东2006年会计从业资格考试《会计基础》试题及答案

1. 在我国,单位的会计核算只能以人民币作为记账本位币。()

2. 不论是盈利,还是亏损,都是财务成果。()

3. 账户的基本结构分为左、右两个方向,左方登记增加,右方登记减少。()

4. “有借必有贷,借贷必相等”的复式记账法的记账规则。()

5. 从会计主体角度考虑,企业发生的每项交易或事项都必须从外部取得原始凭证。()

6. 序时账簿按其记录的内容不同,分为现金日记账和银行存款日记账两种。()

7. 科目汇总表可以采用全部汇总和分类汇总两种汇总方式,但任何格式的科目汇总表都不能反映各科目之间的对应关系。()

8. 对于未达账项应编制银行存款余额调节表进行调节,但不能根据银行对账单将未达账项编制记账凭证登记入账。()

9. 中期财务会计报表包括月度、季度和半年度财务会计报告。()

10.各单位保存的会计档案不得借出,本单位内部人员查阅或犁会计档案,应经会计主管人员批准。()考试大:会计从业资格证考试 来源:考试大—会计从业资格证考试

2√

7√

8√

9√

10×

--
we drink green tea

会计档案的概念


会计档案是指会计凭证、会计账簿和会计报表以及其他会计资料等会计核算的专业材料,它是记录和反映经济业务的重要历史资料和证据。《规范》第四十五条对会计档案管理问题作出了规定。  
会计档案的内容
  会计档案的内容一般指会计凭证、会计账簿、会计报表以及其他会计核算资料等四个部分。

  (1)会计凭证。会计凭证是记录经济业务,明确经济责任的书面证明。它包括自制原始凭证、外来原始凭证、原始凭证汇总表、记账凭证(收款凭证、付款凭证、转账凭证三种)、记账凭证汇总表、银行存款(借款)对账单、银行存款余额调节表等。

  (2)会计账簿。会计账簿是由一定格式、相互联结的账页组成,以会计凭证为依据,全面、连续、系统地记录各项经济业务的簿籍。它包括按会计科目设置的总分类账、各类明细分类账、现金日记账、银行存款日记账以及辅助登记备查簿等。

  (3)会计报表。会计报表是反映企业会计财务状况和经营成果的总结性书面文件,主要有主要财务指标快报,月、季度会计报表,年度会计报表,包括资产负债表、损益表、财务情况说明书等。

  (4)其他会计核算资料。其他会计核算资料属于经济业务范畴,与会计核算、会计监督紧密相关的,由会计部门负责办理的有关数据资料。如:经济合同、财务数据统计资料、财务清查汇总资料、核定资金定额的数据资料、会计档案移交清册、会计档案保管清册、会计档案销毁清册等。实行会计电算化单位存贮在磁性介质上的会计数据、程序文件及其他会计核算资料均应视同会计档案一并管理。  
会计档案的装订和保管规定
  (1)会计档案的整理立卷。会计年度终了后,对会计资料进行整理立卷。会计档案的整理一般采用"三统一"的办法,即:分类标准统一、档案形成统一、管理要求统一,并分门别类按各卷顺序编号。

  ①分类标准统一。

  一般将财务会计资料分成一类账簿,二类凭证,三类报表,四类文字资料及其他。

  ②档案形成统一。

  案册封面、档案卡夹、存放柜和存放序列统一。

  ③管理要求统一。

  建立财务会计资料档案簿、会计资料档案目录;会计凭证装订成册,报表和文字资料分类立卷,其他零星资料按年度排序汇编装订成册。

  (2)会计档案的装订。会计档案的装订主要包括会计凭证、会计账簿、会计报表及其他文字资料的装订。

  ①会计凭证的装订。

  一般每月装订一次,装订好的凭证按年分月妥善保管归档。

  A.会计凭证装订前的准备工作:

  a.分类整理,按顺序排列,检查日数、编号是否齐全;

  b.按凭证汇总日期归集(如按上、中、下旬汇总归集)确定装订成册的本数;

  c.摘除凭证内的金属物(如订书针、大头针、回形针),对大的张页或附件要折叠成同记账凭证大小,且要避开装订线,以便翻阅保持数字完整;

  d.整理检查凭证顺序号,如有颠倒要重新排列,发现缺号要查明原因。再检查附件有否漏缺,领料单、入库单、工资、奖金发放单是否随附齐全;

  e.记账凭证上有关人员(如财务主管、复核、记账、制单等)的印章是否齐全。

  B.会计凭证装订时的要求:

  a.用"三针引线法"装订,装订凭证应使用棉线,在左上角部位打上三个针眼,实行三眼一线打结,结扣应是活的,并放在凭证封皮的里面,装订时尽可能缩小所占部位,使记账凭证及其附件保持尽可能大的显露面,以便于事后查阅;

  b.凭证外面要加封面,封面纸用尚好的牛皮纸印制,封面规格略大于所附记账凭证;

  c.装订凭证厚度一般1.5厘米,方可保证装订牢固,美观大方。

  会计凭证装订后的注意事项。

  a.每本封面上填写好凭证种类、起止号码、凭证张数、会计主管人员和装订人员签章;

  b.在封面上编好卷号,按编号顺序入柜,并要在显露处标明凭证种类编号,以便于调阅。

  ②会计账簿的装订。

  各种会计账簿年度结账后,除跨年使用的账簿外,其他账簿应按时整理立卷。基本要求是:

  A.账簿装订前,首先按账簿启用表的使用页数核对各个账户是否相符,账页数是否齐全,序号排列是否连续;然后按会计账簿封面、账簿启用表、账户目录、该账簿按页数顺序排列的账页、会计账簿装订封底的顺序装订。

  B.活页账簿装订要求:

  a.保留已使用过的账页,将账页数填写齐全,去除空白页和撤掉账夹,用质好的牛皮纸做封面、封底,装订成册。

  b.多栏式活页账、三栏式活页账、数量金额式活页账等不得混装,应按同类业务、同类账页装订在一起。

  c.在本账的封面上填写好账目的种类,编好卷号,会计主管人员和装订人(经办人)签章。

  C.账簿装订后的其他要求:

  a.会计账簿应牢固、平整,不得有折角、缺角,错页、掉页、加空白纸的现象。

  b.会计账簿的封口要严密,封口处要加盖有关印章。

  c.封面应齐全、平整,并注明所属年度及账簿名称、编号,编号为一年一编,编号顺序为总账、现金日记账、银行存(借)款日记账、分户明细账。

  d.会计账簿按保管期限分别编制卷号,如现金日记账全年按顺序编制卷号;总账、各类明细账、辅助账全年按顺序编制卷号。

  ③会计报表的装订。

  会计报表编制完成及时报送后,留存的报表按月装订成册谨防丢失。小企业可按季装订成册。第一,会计报表装订前要按编报目录核对是否齐全,整理报表页数,上边和左边对齐压平,防止折角,如有损坏部位修补后,完整无缺地装订;第二,会计报表装订顺序为:会计报表封面、会计报表编制说明、各种会计报表按会计报表的编号顺序排列、会计报表的封底;第三,按保管期限编制卷号。

  (3)会计档案的保管。《会计档案管理办法》规定:"当年会计档案,在会计年度终了后,可暂由本单位财务会计部门保管一年,期满之后原则上应由财务会计部门编制清册移交本单位的档案部门保管。"根据上述规定,会计档案的保管要求主要有:

  ①会计档案的移交手续。财务会计部门在将会计档案移交本单位档案部门时,应按下列程序进行:

  A.开列清册,填写交接清单;

  B.在账簿使用日期栏填写移交日期;

  C.交接人员按移交清册和交接清单项目核查无误后签章。

  ②会计档案的保管要求。

  A.会计档案室应选择在干燥防水的地方,并远离易燃品堆放地,周围应备有适应的防火器材;

  B.采用透明塑料膜作防尘罩、防尘布,遮盖所有档案架和堵塞鼠洞;

  C.会计档案室内应经常用消毒药剂喷洒,经常保持清洁卫生,以防虫蛀;

  D.会计档案室保持通风透光,并有适当的空间、通道和查阅地方,以利查阅,并防止潮湿;

  E.设置归档登记簿、档案目录登记簿、档案借阅登记簿,严防毁坏损失、散失和泄密;

  F.会计电算化档案保管要注意防盗、防磁等安全措施。

  ③会计档案的借阅。

  A.会计档案为本单位提供利用,原则上不得借出,有特殊需要须经上级主管单位或单位领导、会计主管人员批准。

  B.外部借阅会计档案时,应持有单位正式介绍信,经会计主管人员或单位领导人批准后,方可办理借阅手续;单位内部人员借阅会计档案时,应经会计主管人员或单位领导人批准后,办理借阅手续。借阅人应认真填写档案借阅登记簿,将借阅人姓名、单位、日期、数量、内容、归期等情况登记清楚。

  C.借阅会计档案人员不得在案卷中乱画、标记,拆散原卷册,也不得涂改抽换、携带外出或复制原件(如有特殊情况,须经领导批准后方能携带外出或复制原件)。

  D.借出的会计档案,会计档案管理人员要按期如数收回,并办理注销借阅手续。

  ④会计档案的保管期限。各种会计档案的保管期限,按其特点可分为永久性和定期性两类。凡是在立档单位会计核算中形成的,记述和反映会计核算的,对工作总结、查考和研究经济活动具有长远利用价值的会计档案,应永久保存。定期保管期限分别为3年、5年、10年、15年、20年和25年6种。会计档案的保管期限,从会计年度终了后的第一天算起,如:1996年度终了日为12月5日,保管期限按1997年元月1日开始计算。

  为了全面反映会计档案情况,上档部门应设置"会计档案备查表"及时记载会计档案的保存数、借阅数和归档数,做到心中有效、不出差错。  
会计档案的销毁规定
  (1)会计档案保管期满,需要销毁时由本单位档案部门提出销毁意见,会同财务会计部门共同鉴定、严格审查,编造会计档案销毁清册。

  (2)机关、团体、事业单位和非国有企业会计档案要销毁时,报本单位领导批准后销毁;国有企业经企业领导审查,报请上级主管单位批准后销毁。

  (3)会计档案保管期满,但其中未了结的债权债务的原始凭证,应单独抽出,另行立卷,由档案部门保管到结清债权债务时为止;建设单位在建设期间的会计档案,不得销毁。

  (4)销毁档案前,应按会计档案销毁清册所列的项目逐一清查核对;各单位销毁会计档案时应由档案部门和财会部门共同派员监销,各级主管部门销毁会计档案时,应由同级财政部门、审计部门派员参加监销;会计档案销毁后经办人在"销毁清册"上签章,注明"已销毁"字样和销毁日期,以示负责,同时将监销情况写出书面报告一式两份,一份报本单位领导,一份归入档案备查。

--
we drink green tea

中期财务会计报表

中期财务会计报表的内容至少包括()

 中期财务会计报表的内容至少包括() a, 资产负债表  b,利润表  c,现金流量表  d,所有者权益表 

最佳答案
 中期财务会计报表的内容至少包括(A,B,C) 中期财务报告至少应当包括资产负债表、利润表、现金流量表及附注.(课本中的原句哦) 确定一定以及肯定!! 

--
we drink green tea