1.1并行和并发
并发:指两个事情在这个时间内一个一个的做。
并行:指一个时间内同时做多个事情。
总结:并发是有顺序的,并行是做多个事情。
1.2创建多线程
//继承Thread类来创建线程
public class ThreadTest {
public static void main(String[] args) {
//设置线程名字
Thread.currentThread().setName("六尘一");
MyThread myThread = new MyThread();
myThread.setName("新的线程:");
//开启线程
myThread.start();
for(int i = 0;i<10;i++){
System.out.println(Thread.currentThread().getName() + i);
}
}
}
class MyThread extends Thread{
//重写run()方法
public void run(){
for(int i = 0;i < 10; i++){
System.out.println(Thread.currentThread().getName() + i);
}
}
}
会循环10个六尘一
总结:继承了Thread就没办法继承其它类了。
1.3:Thread接口与Runnble类的区别:
Runnnble可以使用共同资源。
线程池只能放入实现Runable接口或Callable类线程,不能直接放入继承Thread的类。
1.4线程和进程:
一个程序就是一个进程,而一个程序中的多个任务则被称为线程。
1.5线程安全:
package com.kjzz.Runnable;
public class Aicket implements Runnable{
private int ticket = 100;
/*
* 执行卖票操作
*/
@Override
public void run() {
//每个窗口卖票的操作
//窗口 永远开启
while (true) {
if (ticket > 0) {//有票 可以卖
try {
Thread.sleep(100);
} catch (InterruptedException e) {
// TODO Auto‐generated catch block
e.printStackTrace();
}
//获取当前线程对象的名字
String name = Thread.currentThread().getName();
System.out.println(name + "正在卖:" + ticket);
}
}
}
}
package com.kjzz;
import com.kjzz.Runnable.Aicket;
public class Demo01 {
public static void main(String[] args) {
Aicket t = new Aicket();
Thread thread = new Thread((Runnable) t,"窗口1");
Thread thread1= new Thread((Runnable) t,"窗口2");
Thread thread2 = new Thread((Runnable) t,"窗口3");
thread.start();
thread1.start();
thread2.start();
}
}
这里出现了不该有的票,比如-1和0要怎么解决呢,出现这种情况显然表明这个方法根本就不是线程安全的,出现这种问题的原因有很多
需要用到lock锁
package com.kjzz.Runnable;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
public class Ticket implements Runnable {
private int ticket = 10;
Lock lock = new ReentrantLock();
/*
* 执行卖票操作
*/
@Override
public void run() {
while(true){
lock.lock();
if(ticket>0){
try {
Thread.sleep(50);
} catch (InterruptedException e) {
e.printStackTrace();
}
//获取当前线程对象的名字
String name = Thread.currentThread().getName();
System.out.println(name+"正在卖:"+ticket--);
}
lock.unlock();
}
}
}
打了个lock锁就不会出现这种情况呢
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。