Java知识整理(九)之SE.多线程
2015-09-19 10:12
337 查看
多线程(t.start();后才执行run()方法):
进程与线程的区别:一个进程可以包含多个线程,进程有独立内存单元,线程共享内存单元
并发原理:获取时间片的线程被CPU运行,其他线程全部等待
使用Thread创建并启动线程(继承Thread并重写run()方法):
class MyThread extends Thread{
public void run(){
System.out.println("aaa");
}
}
public static void main(String[] args){
Thread t1 = new MyThread();
t1.start();
}
使用Runnable创建并启动线程(使用Runnable接口,定义其实现类):
class MyRunnable implements Runnable{
public void run(){
System.out.println("aa");
}
}
public static void main(String[] args){
Runnable r1 = new MyRunnable();
Thread t1 = new Thread(r1);
t1.start();
}
使用匿名内部类创建线程:
Thread t1 = new Thread(){
public void run(){
System.out.println("aa");
}
};
Thread t2 = new Thread(r);
Runnable r = new Runnable(){
public void run(){
System.out.println("aa");
}
};
t1.start();
t2.start();
Thread current = Thread.currentThread();获取运行当前代码片段的线程;Thread t = new Thread("构造方法中加字符串自定义名字");
long getId():返回该线程标识符;String getName():返回该线程名称;int getPriority():返回线程优先级;boolean isAlive():测试线程是否处于活动状态
设置线程优先级:void setPriority(int priority);
守护线程:void setDaemon(boolean);boolean isDaemon();当进程只有守护线程,所有守护线程终止,GC就是运行在一个守护线程上
sleep:static void sleep(long ms);使当前线程进入阻塞状态指定毫秒;
yield:static void yield():使当前线程主动让出时间片回到Runnable状态,等待分配时间片;void join():等待当前线程结束
synchronized(同步锁)关键字:将异步操作(并发)变为同步操作(你干完我再干)
多线程并发读写同一个临界变量(多线程共享实例变量/静态公共变量)时发生线程安全问题;
锁机制:
同步代码块:进入同步代码块或者方法会自动上锁,退出后自动解锁
synchronized(同步监视器--锁对象引用){ //代码块} 若方法所有代码需要同步也可以直接给方法上锁;好几个同步代码块用了this,第一个代码块进入了线程,其他代码块都不能用
多个需要同步的线程在访问该同步块时,看到的应该是同一个锁对象引用,否则达不到同步效果。通常我们会使用this来作为锁对象
静态方法锁的是类对象(this变为 类名.class),非静态方法锁的是当前方法所属对象;this指的是当前对象,
wait:等待机制;notify:锁机制;Thread.sleep(100);线程阻塞100毫秒
wait(锁里面的线程wait),notify(随机唤醒一个用到当前对象的线程)和notifyAll(唤醒所有当前对象上的线程)只能在同步控制方法或者同步控制块里面使用,而sleep可以在任何地方使用;sleep是线程类(Thread)的方法,wait是Object类的方法;
BlockingQueue内部使用两条队列,允许两个线程同时向队列一个做存储,一个做取出操作,保证并发安全同时提高效率
线程互斥是指对于共享的进程系统资源,在各单个线程访问时的排它性。当有若干个线程都要使用某一共享资源时,任何时刻最多只允许一个线程去使用,
其它要使用该资源的线程必须等待,直到占用资源者释放该资源。线程互斥可以看成是一种特殊的线程同步(下文统称为同步)。
线程同步是指线程之间所具有的一种制约关系,一个线程的执行依赖另一个线程的消息,当它没有得到另一个线程的消息时应等待,直到消息到达时才被唤醒。
线程池:ExecutorService threadPool = Executors.newFixedThreadPool(2);
线程池里能放2个线程
threadPool.execute(t1);
将线程放入线程池执行,如果要放进去5个,则先执行前2个,再执行2个,再执行1个
死锁:产生条件(同步嵌套):1.互斥条件2.请求和保持条件3.不剥夺条件4.环路等待条件
进程与线程的区别:一个进程可以包含多个线程,进程有独立内存单元,线程共享内存单元
并发原理:获取时间片的线程被CPU运行,其他线程全部等待
使用Thread创建并启动线程(继承Thread并重写run()方法):
class MyThread extends Thread{
public void run(){
System.out.println("aaa");
}
}
public static void main(String[] args){
Thread t1 = new MyThread();
t1.start();
}
使用Runnable创建并启动线程(使用Runnable接口,定义其实现类):
class MyRunnable implements Runnable{
public void run(){
System.out.println("aa");
}
}
public static void main(String[] args){
Runnable r1 = new MyRunnable();
Thread t1 = new Thread(r1);
t1.start();
}
使用匿名内部类创建线程:
Thread t1 = new Thread(){
public void run(){
System.out.println("aa");
}
};
Thread t2 = new Thread(r);
Runnable r = new Runnable(){
public void run(){
System.out.println("aa");
}
};
t1.start();
t2.start();
Thread current = Thread.currentThread();获取运行当前代码片段的线程;Thread t = new Thread("构造方法中加字符串自定义名字");
long getId():返回该线程标识符;String getName():返回该线程名称;int getPriority():返回线程优先级;boolean isAlive():测试线程是否处于活动状态
设置线程优先级:void setPriority(int priority);
守护线程:void setDaemon(boolean);boolean isDaemon();当进程只有守护线程,所有守护线程终止,GC就是运行在一个守护线程上
sleep:static void sleep(long ms);使当前线程进入阻塞状态指定毫秒;
yield:static void yield():使当前线程主动让出时间片回到Runnable状态,等待分配时间片;void join():等待当前线程结束
synchronized(同步锁)关键字:将异步操作(并发)变为同步操作(你干完我再干)
多线程并发读写同一个临界变量(多线程共享实例变量/静态公共变量)时发生线程安全问题;
锁机制:
同步代码块:进入同步代码块或者方法会自动上锁,退出后自动解锁
synchronized(同步监视器--锁对象引用){ //代码块} 若方法所有代码需要同步也可以直接给方法上锁;好几个同步代码块用了this,第一个代码块进入了线程,其他代码块都不能用
多个需要同步的线程在访问该同步块时,看到的应该是同一个锁对象引用,否则达不到同步效果。通常我们会使用this来作为锁对象
静态方法锁的是类对象(this变为 类名.class),非静态方法锁的是当前方法所属对象;this指的是当前对象,
wait:等待机制;notify:锁机制;Thread.sleep(100);线程阻塞100毫秒
wait(锁里面的线程wait),notify(随机唤醒一个用到当前对象的线程)和notifyAll(唤醒所有当前对象上的线程)只能在同步控制方法或者同步控制块里面使用,而sleep可以在任何地方使用;sleep是线程类(Thread)的方法,wait是Object类的方法;
BlockingQueue内部使用两条队列,允许两个线程同时向队列一个做存储,一个做取出操作,保证并发安全同时提高效率
线程互斥是指对于共享的进程系统资源,在各单个线程访问时的排它性。当有若干个线程都要使用某一共享资源时,任何时刻最多只允许一个线程去使用,
其它要使用该资源的线程必须等待,直到占用资源者释放该资源。线程互斥可以看成是一种特殊的线程同步(下文统称为同步)。
线程同步是指线程之间所具有的一种制约关系,一个线程的执行依赖另一个线程的消息,当它没有得到另一个线程的消息时应等待,直到消息到达时才被唤醒。
线程池:ExecutorService threadPool = Executors.newFixedThreadPool(2);
线程池里能放2个线程
threadPool.execute(t1);
将线程放入线程池执行,如果要放进去5个,则先执行前2个,再执行2个,再执行1个
死锁:产生条件(同步嵌套):1.互斥条件2.请求和保持条件3.不剥夺条件4.环路等待条件
相关文章推荐
- Python3写爬虫(四)多线程实现数据爬取
- C#实现多线程的同步方法实例分析
- C#线程间不能调用剪切板的解决方法
- 浅谈chuck-lua中的多线程
- C#简单多线程同步和优先权用法实例
- C#多线程学习之(四)使用线程池进行多线程的自动管理
- C#多线程编程中的锁系统(三)
- C#线程同步的三类情景分析
- C#获取进程或线程相关信息的方法
- C#停止线程的方法
- C#子线程更新UI控件的方法实例总结
- C#多线程学习之(六)互斥对象用法实例
- C#线程队列用法实例分析
- 基于一个应用程序多线程误用的分析详解
- C#多线程学习之(三)生产者和消费者用法分析
- C#多线程学习之(一)多线程的相关概念分析
- C#多线程之Thread中Thread.IsAlive属性用法分析
- C#控制台下测试多线程的方法
- Ruby 多线程的潜力和弱点分析
- C++使用CriticalSection实现线程同步实例