注:
代码示例如下:
/*
创建线程方式1:
MyThread 继承 Thread(线程)
重写Thread类中的run()方法, 在run()方法中来编写我们需要执行的任务代码
*/
public class MyThread extends Thread{
//run方法是线程执行任务的方法
@Override
public void run() {
for (int i = 0; i < 10000; i++) {
System.out.println("MyThread:"+i);
}
}
}
import java.io.Serializable;
/*
创建一个任务,实现Runnable接口
重写Runnable接口中的run方法
*/
public class MyTask implements Runnable{
@Override
public void run() {
//在任务中,我想知道当前是哪个线程正在执行我
Thread thread = Thread.currentThread();//在任务中,通过currentThread()获得当前正在执行的线程
System.out.println(thread.getName());
/*for (int i = 0; i <10000 ; i++) {
System.out.println("mytask:"+i);
}*/
}
}
代码示例如下:
public class MyTask implements Runnable{
@Override
public void run() {
Thread thread = Thread.currentThread();//获得当前正在执行此任务的线程
/*if(thread.getName().equals("线程1")){
try {
Thread.sleep(4000);//让线程休眠 1000毫秒
} catch (InterruptedException e) {
e.printStackTrace();
}
}*/
System.out.println(thread.getName()+":"+thread.getPriority());//获得线程优先级
}
}
多线程是指程序中包含多个执行单元,即在一个程序中可以同时运行多 个不同的线程来执行不同的任务,也就是说允许单个程序创建多个并行 执行的线程来完成各自的任务 。
何时需要多线程
多线程的优点?
多线程的缺点?
线程也是程序,所以线程需要占用内存,线程越多占用内存也越多; 多线程需要协调和管理,所以需要跟踪管理线程,使得cpu开销变大; 线程之间同时对共享资源的访问会相互影响,如果不加以控制会导致数据 出错
多个线程同时读写同一份共享资源时,可能会引起冲突。所以引入线程“同步”机制, 即各线程间要有先来后到。
?同步就是排队+锁:
同步锁:同步锁可以是任何对象,必须唯一,保证多个线程获得是同一个对象(用 来充当锁标记)。
同步执行过程
代码示例如下:
public class PrintNumThread extends Thread{
static int num = 0;
static String object=new String();
/*
wait(); 让线程等待,自动释放锁,必须要其他的线程唤醒
notify(); 唤醒等待中的线程(调用了wait方法的线程),如果有多个等待,唤醒优先级高的
notifyAll() 唤醒所有等待的线程
这三个方法都是Object类中定义的方法,
这三个方法必须在同步代码块中使用,
这三个方法必须通过为锁的对象调用
*/
@Override
public void run() {
while (true){
synchronized (object){
object.notify();//唤醒等待中的线程
if(num<=100){
num++;
System.out.println(Thread.currentThread().getName()+":"+num);
}else{
break;
}
try {
object.wait();//让线程等待.同时释放了锁,等待的线程不能自己醒来,必须让另一个线程唤醒.
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
}
?
/*
柜台角色 共享数据
*/
public class Counter {
int num = 1; //代表商品的数量 例如为0
//负责生产商品的方法 锁对象是this add() 和 sub() 用的是同一把锁
public synchronized void add(){
if(num==0){
System.out.println("生产者生产了一件商品");
num = 1;//生产一件商品
this.notify();//唤醒消费者线程
}else{
try {
this.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
//负责消费商品的方法
public synchronized void sub(){
if(num>0){
System.out.println("消费者拿走了一件商品");
num=0;//消费者拿走了商品
this.notify();
}else{
try {
this.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
/*
生产者线程
*/
public class ProductorThread extends Thread{
Counter counter;
public ProductorThread(Counter counter) {
this.counter = counter;
}
@Override
public void run() {
while (true){
counter.add();//生产者线程 一直生产
}
}
}
public class CustomerThread extends Thread{
Counter counter;
public CustomerThread(Counter counter) {
this.counter = counter;
}
@Override
public void run() {
while (true){
counter.sub(); //消费者线程一直消费
}
}
}
?