线程:
线程的实现方式:1继承Thread 和实现runnable接口
问:
线程的生命周期:
创建,就绪,运行,阻塞,销毁。
多线程:
并发是多个线程被(一个)cpu 轮流切换着执行,
并行是多个线程被多个cpu同时执行。
Thread t=new Thread( new runnable)
T.start();
多线程案例:
package threadimpl;
import thread.MyThread;
public class MainThread {
public static void main(String[] args) {
MyThread tt=new MyThread();
//创建线程
Thread t1=new Thread(tt);
Thread t2=new Thread(tt);
Thread t3=new Thread(tt);
Thread t4=new Thread(tt);
t1.start();
t2.start();
t3.start();
t4.start();
}
}
package thread;
import java.util.concurrent.ThreadFactory;
public class MyThread implements Runnable{
String name="";
public void run() {
int count=100;
// TODO Auto-generated method stub
for(int i=0;i<10;i++)
{
if(count>0)
{
System.out.println(Thread.currentThread().getName()+”:”+count);
count--;
System.out.println("当前count="+count);
}
}
}
}
结果显示:
在多线程环境下发生错误:
由错误分析,在开始执行时,三个线程全部进入run方法执行run,输出Thread :10
.随后有两个线程交替执行打印后,run中还有一个线程未执行打印的前提下0号线程有进入run方法执行 。。。。这就是多线程环境下的错误,执行条件是count>0 后面竟然出现count=-1,大错特错.由此可见,没有锁的情况下,多线程是极其容易出错的。
因此,线程同步问题很重要
线程同步: synchronized块,方法 和实现lock接口
案例演示:
package thread;
import java.util.concurrent.ThreadFactory;
public class MyThread implements Runnable {
String name = "";
int count = 10;
Object obj = new Object();
public void run() {
// TODO Auto-generated method stub
for (int i = 0; i < 10; i++) {
synchronized (obj) {
try {
if (count > 0) {
System.out.println(Thread.currentThread().getName() + ":" + count);
count--;
System.out.println("当前count=" + count);
}
Thread.sleep(1000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
} // synchronized (obj)
}
}
}
结果展示:
由此可见,线程运行有序了。同步锁起了同步作用
下面见同步方法 :同样是synchronized关键字,这次是修饰方法
package thread;
import java.util.concurrent.ThreadFactory;
public class MyThread implements Runnable {
String name = "";
int count = 10;
Object obj = new Object();
public synchronized void run() {
// TODO Auto-generated method stub
for (int i = 0; i < 10; i++) {
try {
if (count > 0) {
System.out.println(Thread.currentThread().getName() + ":" + count);
count--;
System.out.println("当前count=" + count);
}
Thread.sleep(1000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
// synchronized (obj)
}
}
}
结果:
同样起到了同步作用
3,lock接口:
上代码:
package thread;
import java.util.concurrent.ThreadFactory;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
public class MyThread implements Runnable {
String name = "";
int count = 10;
Lock lock=new ReentrantLock();
public void run() {
// TODO Auto-generated method stub
for (int i = 0; i < 10; i++) {
lock.lock();//锁住
try {
if (count > 0) {
System.out.println(Thread.currentThread().getName() + ":" + count);
count--;
System.out.println("当前count=" + count);
}
Thread.sleep(1000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally {
lock.unlock();//解锁
}
// synchronized (obj)
}
}
}
结果
不争不抢,多好。