多线程:
进程:当前正在运行的程序,一个应用程序在内存中的执行程序
线程:进程中的一个执行控制单元
单线程:安全性高,效率低
多线程:安全性低,效率高
多线程的实现方法:Thread
public class MyThread extends Thread {
@Override
public void run() {
for(int i=0;i<100;i++) {
System.out.println(getName()+i);
}
}
}
package com.itxuexi_01;
/*多线程的实现方式:
* 方式1:一种方法是将类声明为Thread的子类。
* 该子类重写Thread类的run 方法。接下来可以分配并启动该子类的实例*/
public class MyThreadDemo_01 {
public static void main(String[] args) {
MyThread mt=new MyThread();
mt.setName("老张");
mt.start();
MyThread mt1=new MyThread();
mt1.setName("老王");
mt1.start();
}
}
主方法是单线程
public class MyThread2 implements Runnable {
@Override
public void run() {
for (int i = 0; i < 100; i++) {
System.out.println(Thread.currentThread().getName()+":"+i);
}
}
}
/*多线程的实现方式:
* 声明实现Runable接口的类。该类然后实现Run方法。然后可以分配该类的实例
* static Thread currentThread():返回当前线程对象*/
public class ThreadDemo {
public static void main(String[] args) {
MyThread2 mt=new MyThread2();
Thread t=new Thread(mt);
t.setName("王五");
t.start();
MyThread2 mt1=new MyThread2();
Thread t1=new Thread(mt1);
t1.setName("李四");
t1.start();
}
}
模拟火车站售票:
static void sleep(lon millis):让线程睡会
TicketsThread
package com.itxuexi_02;
/*同步代码块:synchronzied(锁对象){
}
同步方法:使用关键字synchronized修饰的方法,一旦被一个线程访问,则整个方法全部锁住,其他线程无法访问
注意:非静态同步方法的锁对象是this
静态的同步方法的锁对象是当前类的字节码对象*/
public class TicketThread implements Runnable {
static int tickets=100;
Object obj=new Object();
@Override
public void run() {
while(true) {
/*
* synchronized(obj){
*
* }
*/
method2();
}
}
private synchronized void method() {
if(tickets>0) {
try {
Thread.sleep(100);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName()+":"+tickets--);
}
}
private static synchronized void method2() {
if(tickets>0) {
try {
Thread.sleep(100);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName()+":"+tickets--);
}
}
}
public static void main(String[] args) {
TicketThread tt=new TicketThread();
Thread t=new Thread(tt);
t.setName("窗口1");
Thread t1=new Thread(tt);
t1.setName("窗口2");
Thread t2=new Thread(tt);
t2.setName("窗口3");
Thread t3=new Thread(tt);
t3.setName("窗口4");
t.start();
t1.start();
t2.start();
t3.start();
}
}
synchronized:同步,可以修饰代码块和方法,一旦被某个线程访问,则直接锁住,其他线程无法访问
同步代码块:synchronzied(锁对象){
}
注意: 锁对象需要被所有线程共享
同步:安全性高,效率低