进程和线程
实现多线程
package Thread00;
public class MyThreadDemo {
public static void main(String[] args) {
MyThread my1=new MyThread();
MyThread my2=new MyThread();
my1.run();//错误
my2.run();//错误,应该调用start()方法
my1.start();//导致线程开始执行,java虚拟机调用此线程的run方法
my2.start();
}
}
package Thread00;
//定义一个MyThread类继承Thrad类
public class MyThread extends Thread {
//重写Thread类的run方法
@Override
public void run() {
for (int i = 0; i < 100; i++) {
System.out.println(i);
}
}
}
设置和获取线程名称
package Thread00;
public class MyThreadDemo {
public static void main(String[] args) {
//使用的是无参构造方法
// MyThread my1=new MyThread();
// MyThread my2=new MyThread();
// my1.run();//错误
// my2.run();//错误,应该调用start()方法
// my1.start();//导致线程开始执行,java虚拟机调用此线程的run方法
// //void steName(String name)
// my1.setName("高铁");
// my2.setName("飞机");
//Thread(String Name)
MyThread my1=new MyThread("高铁");
MyThread my2=new MyThread("飞机");
System.out.println(Thread.currentThread().getName());
my1.start();
my2.start();
}
}
线程优先级
package Thread00;
public class ThreadPriority extends Thread{
@Override
public void run() {
for (int i = 0; i < 100; i++) {
System.out.println(getName() + ":" + i);
}
}
}
package Thread00;
public class ThreadPriorityDemo {
public static void main(String[] args) {
ThreadPriority tp1=new ThreadPriority();
ThreadPriority tp2=new ThreadPriority();
ThreadPriority tp3=new ThreadPriority();
tp1.setName("高铁");
tp2.setName("飞机");
tp3.setName("汽车");
System.out.println(tp1.getPriority());//5线程默认优先级是5
System.out.println(tp2.getPriority());
System.out.println(tp3.getPriority());
//设置优先级: public final void setPriority(int newPriority)
System.out.println(Thread.MAX_PRIORITY);//10
System.out.println(Thread.MIN_PRIORITY);//1
System.out.println(Thread.NORM_PRIORITY);//5
tp1.setPriority(5);
tp2.setPriority(10);
tp3.setPriority(1);
tp1.start();
tp2.start();
tp3.start();
}
}
线程控制
睡眠线程
package Thread00;
public class ThreadSleep extends Thread{
@Override
public void run() {
for (int i=0;i<100;i++){
System.out.println(getName()+":"+i);
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
package Thread00;
//static void sleep(long millis)毫秒
public class ThreadSleepDemo {
public static void main(String[] args) {
ThreadSleep ts1=new ThreadSleep();
ThreadSleep ts2=new ThreadSleep();
ThreadSleep ts3=new ThreadSleep();
ts1.setName("1");
ts2.setName("2");
ts3.setName("3");
ts1.start();
ts2.start();
ts3.start();
}
}
等待死亡线程
package Thread00;
public class Threadjoin extends Thread{
@Override
public void run() {
for (int i=0;i<100;i++){
System.out.println(getName()+":"+i);
}
}
}
package Thread00;
import java.io.IOException;
//void join()等待这个线程死亡
public class ThreaJoinDemo {
public static void main(String[] args) throws InterruptedException {
Threadjoin tj1=new Threadjoin();
Threadjoin tj2=new Threadjoin();
Threadjoin tj3=new Threadjoin();
tj1.setName("杨幂");
tj2.setName("超越");
tj3.setName("白鹿");
tj1.start();
try {
tj1.join();
}catch (InterruptedException e){
e.printStackTrace();
}
tj2.start();
tj3.start();
}
}
守护线程
package Thread00;
public class ThreadDaemon extends Thread{
@Override
public void run() {
for (int i = 0; i < 100; i++) {
System.out.println(getName() + ":" + i);
}
}
}
package Thread00;
//void setDaemoDemo(boolean on):将此线程标记为守护线程,当运行的线程都是守护线程是,JVM虚拟机将退出
public class ThreaDaemoDemo {
public static void main(String[] args) {
ThreadDaemon td1=new ThreadDaemon();
ThreadDaemon td2=new ThreadDaemon();
ThreadDaemon td3=new ThreadDaemon();
td1.setName("林一");
td2.setName("小鬼");
//设置主线程为刘备
Thread.currentThread().setName("李钟硕");
//设置守护线程
td1.setDaemon(true);
td2.setDaemon(true);
td1.start();
td2.start();
for (int i=0;i<10;i++){
System.out.println(Thread.currentThread().getName()+":"+i);
}
}
}
线程生命周期
多线程的实现方式
package Thread00;
public class MyRunnable implements Runnable {
@Override
public void run() {
for (int i=0;i<100;i++){
System.out.println(Thread.currentThread().getName()+":"+i);//不能直接使用getName方法,因为没有继承Thread类
}
}
}
package Thread00;
public class MyRunnableDemo {
public static void main(String[] args) {
MyRunnable my=new MyRunnable();
//创建Thread类的对象,把Runnable对象作为构造方法的参数
//Thread(Runnable target)
// Thread t1=new Thread(my);
// Thread t2=new Thread(my);
//Thread(Runnable target,String name)
Thread t1=new Thread(my,"高铁");
Thread t2=new Thread("飞机");
//启动线程
t1.start();
t2.start();
}
}
卖票案例
卖票案例的思考
出现了负数的票
相同的票出现了多次
解决办法
同步方法解决数据安全问题
package Thread00;
public class SellTicket implements Runnable {
private int tickets = 100;
private Object obj=new Object();//一定要是同一个对象,这样才是一把锁
@Override
public void run() {
while (true) { //死循环让卖票的动作一直执行
synchronized(obj) {
if (tickets > 0) {
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName() + "正在出售第" + tickets + "张票");
tickets--;
}
}
}
}
}
package Thread00;
public class SellTicketDemo {
public static void main(String[] args) {
SellTicket s1=new SellTicket();
Thread t1=new Thread(s1,"窗口1");
Thread t2=new Thread(s1,"窗口2");
Thread t3=new Thread(s1,"窗口3");
t1.start();
t2.start();
t3.start();
}
}
同步方法
package Thread00;
public class SellTicket implements Runnable {
private int tickets = 100;
private Object obj=new Object();//一定要是同一个对象,这样才是一把锁
private int x=0;
@Override
public void run() {
while (true) { //死循环让卖票的动作一直执行
if (x % 2 == 0) {
//synchronized (obj) {
synchronized (this) {
if (tickets > 0) {
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName() + "正在出售第" + tickets + "张票");
tickets--;
}
}
}else {
// private synchronized void sellticket(){
// if (tickets > 0) {
// try {
// Thread.sleep(100);
// } catch (InterruptedException e) {
// e.printStackTrace();
// }
// System.out.println(Thread.currentThread().getName() + "正在出售第" + tickets + "张票");
// tickets--;
// }
// }
sellticket();
}
x++;
}
}
private synchronized void sellticket() {
if (tickets > 0) {
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName() + "正在出售第" + tickets + "张票");
tickets--;
}
}
}
package Thread00;
public class SellTicketDemo {
public static void main(String[] args) {
SellTicket s1=new SellTicket();
Thread t1=new Thread(s1,"窗口1");
Thread t2=new Thread(s1,"窗口2");
Thread t3=new Thread(s1,"窗口3");
t1.start();
t2.start();
t3.start();
}
}
同步静态方法
package Thread00;
public class SellTicket implements Runnable {
private static int tickets = 100;
private Object obj=new Object();//一定要是同一个对象,这样才是一把锁
private int x=0;
@Override
public void run() {
while (true) { //死循环让卖票的动作一直执行
if (x % 2 == 0) {
//synchronized (obj) {
synchronized (SellTicket.class) {
if (tickets > 0) {
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName() + "正在出售第" + tickets + "张票");
tickets--;
}
}
}else {
// private synchronized void sellticket(){
// if (tickets > 0) {
// try {
// Thread.sleep(100);
// } catch (InterruptedException e) {
// e.printStackTrace();
// }
// System.out.println(Thread.currentThread().getName() + "正在出售第" + tickets + "张票");
// tickets--;
// }
// }
sellticket();
}
x++;
}
}
private static synchronized void sellticket() {
if (tickets > 0) {
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName() + "正在出售第" + tickets + "张票");
tickets--;
}
}
}
线程安全的类
Lock锁
package Thread00;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
public class Selltickets01 implements Runnable{
private int tickets=100;
private Lock lock=new ReentrantLock();
@Override
public void run() {
while (true) {
try {
lock.lock();
if (tickets > 0) {
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName() + "正在出售第" + tickets + "张票");
tickets--;
}
}finally {
lock.unlock();
}
}
}
}
package Thread00;
public class SellticketsDemo01 {
public static void main(String[] args) {
SellTicket s1=new SellTicket();
Thread t1=new Thread(s1,"窗口1");
Thread t2=new Thread(s1,"窗口2");
Thread t3=new Thread(s1,"窗口3");
t1.start();
t2.start();
t3.start();
}
}
生产者和消费者模式概述
生产者和消费者案例
奶箱类
package Thread00;
public class Box {
//定义一个变量,表示第x瓶奶
private int milk;
//提供存取牛奶和获取牛奶的方法
//定义一个成员变量,表示奶箱的状态,默认情况下是没有牛奶的
private boolean state=false;
public synchronized void put(int milk) {
//如果有牛奶,等待消费者消费
if (state){
System.out.println("状态:"+state);//true
try {
wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
//如果没有牛奶,就生产牛奶
this.milk=milk;
System.out.println("送奶工将第"+milk+"瓶奶放入奶箱");
System.out.println("状态:"+state);//false
//生产完毕后,修改奶箱状态;
state=true;
//唤醒其他等待的线程
notifyAll();
}
public synchronized void get(){
//如果没有牛奶,等待生产
if (!state){
System.out.println("状态:"+state);//false
try {
wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
//如果有牛奶,消费牛奶
System.out.println("顾客拿到第"+milk+"瓶奶");
//消费完毕后,更改奶箱状态
state=false;
//唤醒其他等待的线程
notifyAll();
}
}
消费者类
package Thread00;
public class Customer implements Runnable{
private Box b;
public Customer(Box b) {
this.b=b;
}
@Override
public void run() {
while (true){
b.get();
}
}
}
生产者类
package Thread00;
public class Producer implements Runnable{
private Box b;
public Producer(Box b) {
this.b=b;
}
@Override
public void run() {
for (int i=1;i<=5;i++) {
b.put(i);
}
}
}
测试类
package Thread00;
public class BoxDemo {
public static void main(String[] args) {
Box b=new Box();
Producer p=new Producer(b);
Customer c=new Customer(b);
Thread t1=new Thread(p);
Thread t2=new Thread(c);
t1.start();
t2.start();
}
}