您的位置:首页 > 编程语言 > Java开发

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.环路等待条件
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  多线程 并发 线程