多线程
Thread类(线程类)
public Thread(); //创建一个无名线程对象
public Thread(String name); //创建一个指定名字的线程对象
//MyThread线程类
public class MyThread extends Thread { //继承线程类
@Override
public void run() { //重写run类
for(int i=0;i<20;i++) {
System.out.println("MyThread线程执行第"+i+"次");
}
}
}
//Main方法
public static void main(String[] args) {
MyThread my = new MyThread(); //创建MyThread线程对象
my.start(); //开始Mythread线程
for(int i=100;i<120;i++) {
System.out.println("main线程执行第"+i+"次");
}
}
-
方法二:此方法具有低耦合性、高扩展
-
定义实现类,实现Runnable接口
-
实现类重写run方法
-
创建实现类对象
-
创建Thread线程对象,并把实现类对象作为参数传递
-
启动这个线程
-
示例:
-
//实现Runnable接口
public class MyRunnable implements Runnable {
//重写run方法
@Override
public void run() {
for(int i=0;i<20;i++) {
System.out.println("MyRunnable线程执行第"+i+"次");
}
}
}
//Main方法
MyRunnable my = new MyRunnable(); //创建任务对象
Thread th = new Thread(my); //创建线程对象,并把任务对象作为参数传递
th.start(); //开始线程任务
for(int i=100;i<120;i++) {
System.out.println("main线程执行第"+i+"次");
}
解决线程问题
- 加上同步锁
private Object obj;
syncnronized(obj){
//代码块
}
示例1:
public class Ticktet_Synclock01 implements Runnable{
private int ticket = 100;
private Object obj = new Object(); //创建一个锁对象
@Override
public void run() {
// TODO Auto-generated method stub
while(true) {
//synchronized (this) //使用本类作为所对象
synchronized (obj) { //使用锁对象设置同步锁,
if(ticket >0) {
System.out.println(Thread.currentThread().getName()+"用同步锁卖出第"+ticket+"张票");
ticket--;
}
}
}
}
}
- 用同步方法
public syncnronized sale(){ //此锁对象为这个任务对象
//代码块
}
示例2:
public class Ticktet_Synclock02 implements Runnable{
private int ticket = 100;
@Override
public void run() { //重写run方法
while(true) {
sell();
}
}
//sell方法实现
private synchronized void sell() { //将此方法设置为同步锁方法
if(ticket >0) {
System.out.println(Thread.currentThread().getName()+"用同步锁方法卖出第"+ticket+"张票");
ticket--;
}
}
}
-
Lock接口方式
-
用Lock的实现类:ReentrantLock
-
方法:
-
public class Ticktet_Synclock02 implements Runnable{
Lock lock = new ReentrantLock();
lock.lock(); //加上同步锁
//代码块
lock.unlock();
示例3:
public class Ticktet_Synclock03 implements Runnable{
private int ticket = 100;
Lock l = new ReentrantLock(); //创建一个ReentrantLock实现类对象
@Override
public void run() {
while(true) {
l.lock(); //上锁
if(ticket >0) {
System.out.println(Thread.currentThread().getName()+"用ReentrantLock卖出第"+ticket+"张票");
ticket--;
}
l.unlock(); //解锁
}
}
}