java多线程:基础知识

来源:互联网 发布:wow.js 滚动时不现实 编辑:程序博客网 时间:2024/06/06 09:31
一:进程与线程的区别:
1.进程:一次程序的执行.系统进行资源分配和调度的一个独立单位
2.线程:进程中独立运行的子任务
3.关系:进程包含线程
二:
1.多线程是异步的,调用时间随机
2.代码的顺序,不为线程的执行顺序
三:实现多线程编程的两种方式:
1.继承Thread类 不支持多继承
2.实现Runnable接口 支持多继承 -- 如果想要创建的线程类已经继承了一个类,就不能使用继承Thread的方法,因为java不支持多继承,只能用实现接口的方式了
3:Thread 实现了Runnable接口
四:
myThread.start();的顺序,并不代表线程启动的顺序
五:
MyRunnable myRunnable = new MyRunnable();
Thread thread = new Thread(myRunnable);
继承Runnable接口,需要将将该对象通过Thread的8个不同的构造函数传值
六:非线程安全
指多个线程对同一对象中的同一实例变量进行操作时,出现值被更改与值不同步的情况,进而影响程序的执行流程
七:synchronized关键词
线程调用的共享资源所使用对象的方法前面添加,共享资源时,会通过"锁"的方式,进行对多个线程排队,便不会出现非线程安全问题.
八.System.out.print(); 与 i--问题
System.out.print(i--);当不同线程调用时,虽然print在方法内部是同步的,但是i--是在print前发生的,所以有发生非线程安全问题的概率,
可以看println的源码,是在内部用synchronized同步的
九.Thread.currentThread()与this的不同
Thread.currentThread()为当前正在执行的线程,this为本线程
十.
直接使用.star()方法和.run方法是不同的,使用star()方法才会启动该线程,当使用run方法是只会使用当前正在运行的线程,而不会启动该线程.
谨记:所有的线程都是异步进行的
十一. java中3种终止正在运行的线程的方法
1.使用退出标志,正常退出,就是当run方法执行完之后线程终止
2.使用stop()方法强行终止,不推荐,已经被depression
3.使用interrupt()方法中断线程,该方法并不是停止线程,只是打了一个停止的标记,线程还是会继续运行
十二.interrupted方法与isinterrupted方法的区别
1.interrupted方法是判断当前线程的是否处于停止状态,interrupt后便为停止状态,但线程并未真正的停止, 该方法会清除状态,比如两次使用该方法,第一次使用返回为true,该方法便会清除状态为false,则第二个方法返回为false
2.isInterrupted方法为调用该方法的线程对象是否为中断状态,不清除状态标志
十三.sleep()与wait()方法的区别
1.sleep()
sleep()使当前线程进入停滞状态(阻塞当前线程),让出CUP的使用、目的是不让当前线程独自霸占该进程所获的CPU资源,以留一定时间给其他线程执行的机会;
   sleep()是Thread类的Static(静态)的方法;因此他不能改变对象的机锁,所以当在一个Synchronized块中调用Sleep()方法是,线程虽然休眠了,但是对象的机锁并木有被释放,其他线程无法访问这个对象(即使睡着也持有对象锁)。
   在sleep()休眠时间期满后,该线程不一定会立即执行,这是因为其它线程可能正在运行而且没有被调度为放弃执行,除非此线程具有更高的优先级。
2.wait()方法
wait()方法是Object类里的方法;当一个线程执行到wait()方法时,它就进入到一个和该对象相关的等待池中,同时失去(释放)了对象的机锁(暂时失去机锁,wait(long timeout)超时时间到后还需要返还对象锁);其他线程可以访问;
   wait()使用notify或者notifyAlll或者指定睡眠时间来唤醒当前等待池中的线程。
   wiat()必须放在synchronized block中,否则会在program runtime时扔出”java.lang.IllegalMonitorStateException“异常。
十四.停止线程的方法
1.抛出异常法(interrupt()方法)
在run中使用interrupted方法判断是否处于终止状态,若处于该状态,就在该方法体内抛出InterruptedException异常,该线程即停止
例如: if (this.isInterrupted()){
System.out.println("停止了!");
throw new InterruptedException();
}
2.睡眠中停止(interrupt()方法)
如果在一个线程的run方法中,使用Thread.sleep();使其睡眠,在主方法中使用interrupt()方法,可以使该线程在睡眠中停止.
3.使用return停止线程
在调用该线程的方法里面使用interrupt()方法后,判断成功后使用return停止该线程.
例如: if (this.isInterrupted()){
System.out.println("停止了!");
return;
}
十五.暂停线程的方法
1.suspend方法与resume 方法的使用
suspend方法为暂停线程 ,resume为恢复线程
这两个方法已经过期作废了,但还是可以使用的,但尽量不要使用,因为他们有两个缺点,第一个就是独占cpu资源就是在停止的时候不会释放cpu资源,而是一直占着cpu.第二个缺点为会出现因为暂停而导致数据不同步的状况.
2.yield方法
作用:放弃当前的cpu资源,让给其他的任务去占用cpu的执行时间
特点:放弃的时间不确定,有可能刚刚放弃,又马上获得cpu的时间片
十六.线程的优先级
1.相关方法:线程的优先级使用setPriority()方法来设定,默认优先级分为1-10这10个等级
2.相关常量:
public final static int MIN_PRIORITY = 1;//自定义最小优先级
public final static int NORM_PRIORITY = 1;//自定义默认优先级
public final static int MAX_PRIORITY = 1;//自定义最大优先级
3.优先级的继承特性:
如果A线程启动了B线程,则B线程会继承A线程所拥有的优先级.例如,如果main线程的优先级为5,main方法中启动了A线程,则A线程的优先级也为5
4.优先级的规则性:
4.1.当优先级差距很大时,谁先执行完与代码的调用顺序无关.
4.2.CPU会尽量将执行资源给优先级比较高的线程,而不是必须高线程执行完才会执行低优先级线程
5.优先级的随机性
优先级高的线程并不一定都想执行完run方法中的任务,线程优先级与打印顺序无关.
6.优先级高的线程运行的"快",因为cpu为高优先级线程分配的资源比低优先级多,也就是高线程占用的cpu时间片多.
十七.多线程的分类
1.用户线程
2.守护线程
3.他们的异同与作用,在此引用博客园中博友的博客,博客地址:http://www.cnblogs.com/super-d2/p/3348183.html
写的非常好,我就不在此赘述了.在此感谢该博主的分享.






























原创粉丝点击