----------------------android培训、java培训、期待与您交流! ----------------------
知识梳理:
所谓的多线程就是指一个进程里面包含多个任务单元,在CPU和内存硬件支持范围内不停的切换运行,从而达到了在同一时间同时执行多项任务的效果!多线程能够提高执行效率,就好比我现在需要写完10篇日志,一个人写虽然慢,然是也能够完成! 如果有5个人一起来帮我写,那效率就会提高!一个进程中只要有一个线程活着,那么这个进程将不会死掉。
在Java里面需要实现多线程的方法有两种:
第一种:继承了Thread类,然后重写里面的run();方法,最后调用Thread里面的start();方法。
代码演示范例:
package com.fengfeng.Thread;
public class Thread1 extends Thread //继承父类
{
@Override
public void run() //重写run方法
{
// TODO Auto-generated method stub
for (int i = 0; i < 60; i++)
{
System.out.println(currentThread().getName() + ".....run" + i);
}
}
}
第二种:利用Runnable接口实现类,重写里面的run();方法,实例一个Runnable的实现类的实例对象,实例一个Thread对象并且传入实现类的实力对象到构造方法,最后调用Thread里面的start();方法。
代码演示范例:
package com.fengfeng.Thread;
public class ThreadImpl implements Runnable {
private int ii = 100;
@Override
public void run() {
// TODO Auto-generated method stub
while (true) {
synchronized (ThreadImpl.class) {
if(ii>0)
System.out.println(Thread.currentThread().getName() + ".....run" + ii--);
}
}
}
public static void main(String[] args) {
ThreadImpl t = new ThreadImpl();
Thread t1 = new Thread(t);
Thread t2 = new Thread(t);
t1.start();
t2.start();
for (int i = 1; i < 60; i++) {
System.out.println("Main ...." + i);
}
}
}
在多线程的6种状态: 分别为开启状态、睡眠状态、暂停状态、唤醒状态、结束状态、和特殊的阻塞状态(临时状态)。
代码演示:
public static void main(String[] args) throws Exception{
ThreadImpl t = new ThreadImpl();
Thread t1 = new Thread(t);
t1.start();//开启状态
t1.sleep(10);//睡眠状态
t1.notify();//唤醒状态
t1.wait();//暂停状态
t1.stop();//结束状态
for (int i = 1; i < 60; i++) {
System.out.println("Main ...." + i);
}
}
}
在多线程中会出现安全隐患,解决方法是将会出现问题的代码放入同步代码块当中或者是同步函数当中。
同步代码块代码演示:
synchronized (this.class)
{
//.......问题代码
}
同步函数就简单了,直接把synchronized 当作函数的修饰符。
为了我们的代码、我们的程序更加的安全。我们使用同步代码块来解决。但是在使用同步代码块的同时也会消耗资源,解决办法避免多次去判断锁,只将问题代码包裹在同步代码块当中。
在使用锁的同时需要注意,如果是同步代码块,那么传入的只要是对象都可以,但是,如果是用同步函数就要注意了,用的锁就是this.class ,如果这个同步函数是静态的,那么这个锁就应该是 类名.Class。
死锁:就是访问锁的对象类型不匹配的同步代码块。这个时候可能就会出现死锁、程序将卡住。 经可能的避免死锁的发生。
锁(Lock):
Lock
实现提供了比使用 synchronized
方法和语句可获得的更广泛的锁定操作。此实现允许更灵活的结构,可以具有差别很大的属性,可以支持多个相关的 Condition
对象。以前的几种状态都封装在Condition
里面了。 灵活性提高了。
线程示范:
package com.fengfeng.ThreadDemo;
import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
class Son{
public static void main(String[] args)
{
final Lock lock = new ReentrantLock();
final Condition condition = lock.newCondition();
new Thread(){
@Override
public void run() {
// TODO Auto-generated method stub
lock.lock();
try {
for (int i = 0; i < 50; i++) {
if (i==18) {
condition.await();
}
System.out.println("123123");
}
} catch (Exception e) {
// TODO: handle exception
}finally
{
lock.unlock();
}
}
}.start();
}
}
---------------------- android培训、java培训、期待与您交流! ----------------------