java怎么复用代码 java编写代码实现文件复制的功能( 四 )


运行(running)
线程获得CPU资源正在执行任务(run()方法),此时除非此线程自动放弃CPU资源或者有优先级更高的线程进入,线程将一直运行到结束 。
死亡(dead)
当线程执行完毕或被其它线程杀死,线程就进入死亡状态,这时线程不可能再进入就绪状态等待执行 。
自然终止:正常运行run()方法后终止
异常终止:调用stop()方法让一个线程终止运行
堵塞(blocked)
由于某种原因导致正在运行的线程让出CPU并暂停自己的执行,即进入堵塞状态 。
正在睡眠:用sleep(long t) 方法可使线程进入睡眠方式 。一个睡眠着的线程在指定的时间过去可进入就绪状态 。
正在等待:调用wait()方法 。(调用motify()方法回到就绪状态)
被另一个线程所阻塞:调用suspend()方法 。(调用resume()方法恢复)
232.volatile关键字是否能保证线程安全?
答:不能 。虽然volatile提供了同步的机制 , 但是知识一种弱的同步机制,如需要强线程安全 , 还需要使用synchronized 。
Java语言提供了一种稍弱的同步机制,即volatile变量,用来确保将变量的更新操作通知到其他线程 。当把变量声明为volatile类型后 , 编译器与运行时都会注意到这个变量是共享的 , 因此不会将该变量上的操作与其他内存操作一起重排序 。volatile变量不会被缓存在寄存器或者对其他处理器不可见的地方,因此在读取volatile类型的变量时总会返回最新写入的值 。
一、volatile的内存语义是:
当写一个volatile变量时,JMM会把该线程对应的本地内存中的共享变量值立即刷新到主内存中 。
当读一个volatile变量时,JMM会把该线程对应的本地内存设置为无效,直接从主内存中读取共享变量 。
二、volatile底层的实现机制
如果把加入volatile关键字的代码和未加入volatile关键字的代码都生成汇编代码 , 会发现加入volatile关键字的代码会多出一个lock前缀指令 。
1 、重排序时不能把后面的指令重排序到内存屏障之前的位置
2、使得本CPU的Cache写入内存
3、写入动作也会引起别的CPU或者别的内核无效化其Cache,相当于让新写入的值对别的线程可见 。
238.同步和异步有何异同 , 在什么情况下分别使用它们?
答:1.如果数据将在线程间共享 。例如正在写的数据以后可能被另一个线程读到 , 或者正在读的数据可能已经被另一个线程写过了,那么这些数据就是共享数据 , 必须进行同步存取 。
2.当应用程序在对象上调用了一个需要花费很长时间来执行的方法,并且不希望让程序等待方法的返回时,就应该使用异步编程,在很多情况下采用异步途径往往更有效率 。
3.举个例子: 打电话是同步 发消息是异步
239.Java线程中,sleep()和wait()区别
答:sleep是线程类(Thread)的方法;作用是导致此线程暂停执行指定时间,给执行机会给其他线程,但是监控状态依然保持,到时后会自动恢复;调用sleep()不会释放对象锁 。
wait是Object类的方法;对此对象调用wait方法导致本线程放弃对象锁,进入等 待此对象的等待锁定池 。只有针对此对象发出notify方法(或notifyAll)后本线程才进入对象锁定池,准备获得对象锁进行运行状态 。
发布于 3 年前著作权归作者所有
Java仅仅有一个参数不一致,如何提高代码复用性如果你用的是eclipse可以用快捷键来抽取方法的,就是选中重复的代码,然后按alt+shift+m,就解决你的代码重复问题 。
java 线程池是怎么复用线程的线程重用java怎么复用代码的核心是java怎么复用代码,它把Thread.start()给屏蔽起来了(一定不要重复调用)java怎么复用代码,然后它自己有一个Runnable.run(),循环在跑,跑的过程中不断检查我们是否有新加入的子Runnable对象,有就调一下我们的run(),其实就一个大run()把其它小run()#1,run()#2,...给串联起来了 , 基本原理就这么简单 。

推荐阅读