线程
来源:互联网 发布:portraiture mac 编辑:程序博客网 时间:2024/06/05 00:42
线程
并发:同时执行
线程:共享进程资源
同步:步调一致的顺序执行
异步:步调不一致的同时执行
线程(Thread)
---->run()方法:独立运行的过程
---->start():启动run()
过程:
1.创建一个线程
2.覆盖run()方法,并提供独立的运行过程
3.调用Thread实例的start()方法,启动run()方法
线程状态:
start()
new Thread()----->可运行态Runnable----->运行态Running----->结束状态Dided
| |
| |
<--- block阻塞<-----
线程结束后,不可返回新建状态,只可进行垃圾回收,不可Start()。stop()方法不安全,不推荐使用
Thread.yield():出让当前处理器(离开Running),变为可运行态Runnable.
Thread.sleep(times):使当前由Running让出处理器,进入block状态,休眠times毫秒,返回到Runnable状态。
如果其他线程打断当前线程(Block)的执行,会发生异常InterruptedException().
Thread实例的t.interrupt();方法会使t实例产生异常。
package ThreadDemo;
public class Demo {
public static void main(String[] args) {
Thread t=new Thread(){
public void run() {
for(int i=0;i<10;i++){
System.out.println("睡觉呢");
try {
sleep(1000);
} catch (InterruptedException e) {
//e.printStackTrace();
System.out.println("干嘛呢,破相了");
}
}
};
};
t.start();
System.out.println("砸墙");
for (int i = 0; i < 5; i++) {
try {
Thread.sleep(500);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
t.interrupt();
System.out.println("墙穿了");
}
}
后台线程(守护线程,精灵线程):Thread.setDaemon(true)将线程设置为后台线程。
进程的结束:当前前台线程全部结束,Java进程结束。后台进程,不管是不是结束,都会停掉。
线程的优先级:默认有10级优先级,优先级高的线程获得的执行机会多,机会的多少不能通过代码干预。
默认优先级为5 Thread.setPriority(Thread.MAX_PRIORITY);设置为最高级10.
创建线程的方法:
1.覆盖Thread类
2.实现Runnable()接口
a.实现Runnable()接口,实现run()方法,提供并发运行的过程。
b.创建这个类的实例,用这个实例作为Thread构造器的参数,创建Thread类
c.使用start()方法启动
3.使用内部类或匿名类
new Thread(){
public void run() {
for(int i=0;i<100;i++){
System.out.println("Hi");
}
};
}.start();
new Thread(new Runnable() {
@Override
public void run() {
for(int i=0;i<100;i++){
System.out.println("Bye");
}
}
}).start();
业务中写日志是写到内存数组中,再起一线程有数组写入文件。
线程同步 synchronized
多个线程并发读写同一个线程资源时会发生线程安全问题
可以使用同步代码块解决问题,同步解决读写问题,解决并发问题
1.方法同步:加在方法前
2.代码块同步:加在代码块上
同步监视器是一个任意对象实例,是多线程之间互斥的锁操作,多个线程要使用同一个“监视器”
Object mutex=new Object();
synchronized (同步监视器) {//可以使用synchronized (this) 即当前类
...//需同步的代码块
}
Java的同步API
StringBuffer,Vector,HashTable同步的
StringBuilder,ArrayList,HashMap不同步的
Collections.synchronizedList():转同步,集合包裹
异步线程之间,协作通信
异步写文件:
创建读线程,创建写线程,创建缓冲数组
wait()与notify()异步等待及唤醒
Timer定时器
package ThreadDemo;
import java.util.Timer;
import java.util.TimerTask;
public class TimerDemo {
public static void main(String[] args) {
final Timer t=new Timer();
t.schedule(new TimerTask() {//10ms中以后,每隔50ms执行run()方法
int i=60;
@Override
public void run() {
System.out.println("还有:"+i--);
if(i==0){
t.cancel();//结束线程
System.out.println("我还会回来的");
}
}
}, 10, 50);
}
}
- 线程
- 线程
- 线程
- 线程
- 线程
- 线程
- 线程
- 线程
- 线程
- 线程
- 线程
- 线程
- 线程
- 线程
- 线程
- 线程
- 线程
- 线程
- 递归练习--求1*1+2*2+...+n*n
- 数据挖掘——基础篇
- windows8.1 高级启动
- [Java] 数组-01 入门
- java实现一个录音播放的功能
- 线程
- WEB跨站脚本和cookie(httponly-cookie设置)安全了解
- 在VMware中安装Ubuntu进不了图形界面的解决方法
- js实现图片切换效果图
- 经典算法在几个开源项目中的应用
- Treap
- AIX,Redhat下实现nfs文件系统开机自动mount
- C++ const用法及注意事项
- Flash Media Live Encoder 使用帮助