多线程
1.什么是线程
它是操作系统能够进行运算调度的最小单位。它被包含在进程之中,是进程中的实际运作单位。
而多线程是为了充分利用cpu资源提高效率
2.如何在java中创建多线程
它有两种方式:
-
继承Thread类
public class MyThread extends Thread { @Override public void run() { for (int i = 0; i < 20; i++) { System.out.println(this.getName()+"------------------"+i); } } }
//新建线程对象 MyThread m1 = new MyThread(); //开启线程 m1.start();
-
实现Runnable接口
public class MaiPiao implements Runnable{
private int num=100;
public void run() {
while (true){
if (num > 0) {
num--;
System.out.println(Thread.currentThread().getName() + "卖出了一张剩余" + num + "张");
} else {
break;
}
}
}
}
//新建任务对象
MaiPiao m = new MaiPiao();
//新建线程对象接收
Thread t1 = new Thread(m);
//开启线程
t1.start();
其中
getName
()为获取线程名方法。java只允许单继承,但是可以实现多个接口。 选择第一种继承Thread方式,那么他就无法继承别的类,不利于扩展。
3.Thread线程类中常用方法
//休眠
//当前线程主动休眠一段时间单位为毫秒
public static void sleep(long millis)
//放弃
//主动放弃当前抢夺到的时间片,竞争下一次时间片
public static void yield()
//加入
//允许其他线程加入当前线程,执行完之后才会执行当前线程
public final void join()
//获取当前线程
.currentThread()
//优先级
//默认为5 分为10~0 值越大抢到时间片的概率越高
.setPriority()
//守护线程
//线程有两类:用户线程(前台线程)和守护线程(后台线程)
//如果程序中所有前台线程都执行完毕了,后台线程也会自动结束(无论后台线程是否执行完毕)。
.setDaemon(true)
4.线程安全
当多个线程共享一个资源时,可能会出现线程安全问题。
一个线程正在访问数据,并且对数据进行了修改,而这种修改还没有提交,另外一个线程也访问这个数据,然后使用了这个数据
如何解决线程安全问题? ----使用锁。--->凡是用锁 锁定的代码都是原子操作。
第一种自动锁: synchronized(共享数据)
public class MaiPiao implements Runnable{
private int num=100;
public void run() {
while (true){
synchronized (this) {
if (num > 0) {
num--;
System.out.println(Thread.currentThread().getName() + "卖出了一张剩余" + num + "张");
} else {
break;
}
}
}
}
}
第二种手动锁: Lock
public class MaiPiao implements Runnable{
private Lock l=new ReentrantLock();
private int num=100;
public void run() {
while (true){
l.lock();
if (num > 0) {
num--;
System.out.println(Thread.currentThread().getName() + "卖出了一张剩余" + num + "张");
} else {
break;
}
l.unlock();
}
}
}
标签:Thread,void,num,线程,多线程,public
From: https://www.cnblogs.com/fafwfw/p/17630531.html