sleep(休眠)
- 当t线程调用Thread.sleep()时,会让线程t休眠指定时间
- Thread.sleep() 和 Thread.currentThread().sleep() 效果一样
- sleep方法不会释放同步锁
- sleep不会影响到其他线程
yield(让步)礼让线程
- 在t线程中调用Thread.yield()时会让t线程放弃一次cpu调度(通常是当前这次调度)
- yield让当前线程让步给其他线程执行
wait(锁住等待)
- 当t线程调用obj.wait()时,t线程会进入waiting状态,并放弃obj对象锁,直到其他线程调用obj.notify()/notifyAll()方法唤醒线程t
- wait方法会释放同步锁
- 线程只能在一个同步块中调用wait方法
- wait方法让两个线程交替执行
join(加入):jion()或者join(int)时间,可以等待指定的毫秒之后继续
- 在main线程中调用线程t.join()时,main线程会等待t线程完全执行完成才会继续执行
- join让两个线程串行执行
守护线程 setsetDaemon(true或者false)
- 设置一个线程为守护线程, 该线程不会单独执行, 当其他非守护线程都执行结束后, 自动退出
设置线程优先级
- setPriority()设置线程的优先级
同步代码块
- 1.什么情况下需要同步
- 当多线程并发, 有多段代码同时执行时, 我们希望某一段代码执行的过程中CPU不要切换到其他线程工作. 这时就需要同步.
- 如果两段代码是同步的, 那么同一时间只能执行一段, 在一段代码没执行结束之前, 不会执行另外一段代码.
- 2.同步代码块
- 使用synchronized关键字加上一个锁对象来定义一段代码, 这就叫同步代码块
- 多个同步代码块如果使用相同的锁对象, 那么他们就是同步的
- 注意:锁对象可以是任意对象,但是被锁的代码需要保证是同一把锁,不能用匿名对象
- 例子:
同步方法
- 使用synchronized关键字修饰一个方法, 该方法中所有的代码都是同步的
- /*
- * 非静态同步函数的锁是:this
- * 静态的同步函数的锁是:字节码对象
- */
- public static synchronized void print2() {
- System.out.print("传");
- System.out.print("智");
- System.out.print("播");
- System.out.print("客");
- System.out.print(" ");
- }
死锁:多线程同步的时候, 如果同步代码嵌套, 使用相同锁, 就有可能出现死锁,所以尽量不要嵌套使用
线程安全问题:
- 多线程并发操作同一数据时, 就有可能出现线程安全问题
- * 使用同步技术可以解决这种问题, 把操作数据的代码进行同步, 不要多个线程一起操作