一个进程可以含有多个线程,进程和进程资源不共享,线程和线程中堆内存,栈内存方法区资源独立,一个线程一个栈。多线程提高程序效率。MAIN方法结束不代表程序结束,一个MAIN方法结束只代表当前线程结束。
多线程并发:线程线程之间互不影响,对于单核CPU通过加快处理速度从而达到“多线程并发”。
实现线程的三种方式:1.编写一个类直接继承Thread并重写RUN方法。可以在MAIN方法中进行新建线程。Start()方法作用:启动一个分支线程,并在JVM中开辟一个栈空间,然后结束。启动成功的线程会自动调用RUN方法,并压栈到栈底部。方法体中是自上而下进行的。
2.采用接口(面向接口):写一个实现RUNNABLE接口类,然后实例化接口对象做为参数构造新线程,并且可以继承其他类,更灵活,如采用匿名内部类:创建对象时直接将RUNNABLE接口实现并作为参数构造新线程。
3.实现Callable接口:创建未来任务类对象(FutureTask)重写call方法(返回Object类)。可通过一个线程访问另一个线程的结果(调用get()方法)但调用线程阻塞。
线程生命周期:
新建状态:NEW 出来的线程对象。
就绪状态:线程进行抢夺CPU时间片。
运行状态:run方法的执行,有可能线程占用的时间片用完之后会继续进入就绪状态,也可能进入阻塞状态。
死亡状态:run方法运行结束之后,线程死亡。
阻塞状态:当遇到键盘输入或者SLEEP方法(静态方法:不能通过对象进行调用,出现在哪个线程中,即线程进入休眠状态)时,线程会进行停止运行,放弃当前占有的CPU时间片。会继续进行抢夺CPU时间片,继续上次的·run方法继续执行。
终止线程:贴个标签。
线程安全:
线程同步机制:线程不能并发,效率低,但安全。
异步机制:多线程并发,效率高,不安全。
线程同步机制:锁机制,一个对象一把锁,synchronized(多线程共享的数据(对象))。
变量:局部变量(在栈中)不共享,不存在线程安全问题,一个线程一个栈。
实例变量(在堆中),静态变量(在方法区中),有且仅有一个,存在线程安全问题。
synchronized的3种写法:1.同步代码块
2.在实例方法上使用synchronized表示共享对象一定时this并且同步代码块是整个方法体。
3.在静态方法上,表示找类锁,类锁只有一把(模板只有一个),100个对象一把类锁。
解决线程安全问题:
1.局部变量代替静态或实例变量;
2.如必须是实例变量,则需创建多个对象;
3.最后不得不选择synchronized。
守护线程:所有用户线程结束,守护线程结束,main方法是一个用户线程,垃圾回收线程即是一个守护线程。作用:数据进行备份。用法:Thread.setDaemon(true)。
定时器:作用:每隔特定时间,执行特定程序。
1.使用Sleep方法睡眠。
2.使用JAVA类库Java.util.Timer
3.Spring提供的SpringTask框架
wait和notify方法(任何对象都可以调用):作用在当前对象上。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)