wait和sleep
- wait方法来自Object类中,sleep方法来自Thread类中
- sleep方法没有释放锁,而wait方法释放了,使得其他线程可以使用同步控制块或者方法
- sleep方法可以在任何地方使用,wait,notify,notifyAll只能在同步控制方法或者同步控制块里面使用
- sleep方法必须捕获异常(在sleep的过程中过程中有可能被其他对象调用它的interrupt(),产生InterruptedException异常,如果你的程序不捕获这个异常,线程就会异常终止,进入TERMINATED状态,如果你的程序捕获了这个异常,那么程序就会继续执行catch语句块(可能还有finally语句块)以及以后的代码)。wait,notify,notifyAll方法不需要捕获异常
yield()和join()
- yield()方法是停止当前线程,让同等优先权的线程或者更高优先级的线程有执行的机会,如果没有的话,那么yield()方法将不会起作用,并且由可执行状态后变成马上执行
- join()方法用于在某一个线程的执行过程中调用另一个线程执行,等到调用的线程执行结束后,再执行当前线程。
interrupt()方法
- 这是给线程一个通知信号,会影响这个线程内部的一个中断标识位。这个线程并不会因此而改变状态(如阻塞。终止等)
- 如果某一线程调用了sleep()方法,处于time-waiting状态,这时调用interrupt方法会抛出interruptException,从而使线程提前结束timed-waiting状态
- 许多声明抛出interruptException的方法,抛出异常前,会清除之前设置的中断标识位,所以抛出异常后,调用isInterrupt()方法会返回false。
- 中断标识位是线程固有的一个标识位,可以通过该标识位优雅安全地终止线程,在线程内部会根据thread.interrupt()的值来终结线程。
stop() 和 suspend() 方法为何不推荐使用?
- 反对使用 stop(),是因为它不安全。它会解除由线程获取的所有锁定,而且如果对象处于一种不连贯状态,那么其他线程能在那种状态下检查和修改它们。结果很难检查出真正的问题所在。
- suspend() 方法容易发生死锁。调用 suspend() 的时候,目标线程会停下来,但却仍然持有在这之前获得的锁定此时,其他任何线程都不能访问锁定的资源,除非被 “挂起” 的线程恢复运行。对任何线程来说,如果它们想恢复目标线程,同时又试图使用任何一个锁定的资源,就会造成死锁。所以不应该使用 suspend(),而应在自己的 Thread 类中置入一个标志,指出线程应该活动还是挂起。若标志指出线程应该挂起,便用 wait() 命其进入等待状态。若标志指出线程应当恢复,则用一个 notify() 重新启动线程
当一个线程进入一个对象的一个 synchronized 方法后,其它线程是否可进入此对象的其它方法?
• 其他方法前是否加了 synchronized 关键字,如果没加,则能。
• 如果这个方法内部调用了 wait,则可以进入其他 synchronized 方法。
• 如果其他个方法都加了 synchronized 关键字,并且内部没有调用 wait,则不
能。
• 如果其他方法是 static,它用的同步锁是当前类的字节码,与非静态的方法不
能同步,因为非静态的方法用的是 this。 ‘
run() 和 start() 区别
- start()方法来启动线程,真正实现了多线程运行。这时无需等待run方法体代码执行完毕,可以直接继续执行下面的代码;通过调用Thread类的start()方法来启动一个线程, 这时此线程是处于就绪状态, 并没有运行。 然后通过此Thread类调用方法run()来完成其运行操作的, 这里方法run()称为线程体,它包含了要执行的这个线程的内容, Run方法运行结束, 此线程终止。然后CPU再调度其它线程。
- run()方法当作普通方法的方式调用。程序还是要顺序执行,要等待run方法体执行完毕后,才可继续执行下面的代码; 程序中只有主线程——这一个线程, 其程序执行路径还是只有一条, 这样就没有达到写线程的目的。
BLOB类型和TEXT类型区别
- TEXT与BLOB的主要差别就是BLOB保存二进制数据,TEXT保存字符数据。目前几乎所有博客内容里的图片都不是以二进制存储在数据库的,而是把图片上传到服务器然后正文里使用标签引用,这样的博客就可以使用TEXT类型。而BLOB就可以把图片换算成二进制保存到数据库中。
- 在TEXT或BLOB列的存储或检索过程中,不存在大小写转换,都一样!
- 对于BLOB和TEXT列的索引,必须指定索引前缀的长度。