多线程
一.多线程的类别:
sleep表示线程睡眠。单位毫秒。
a.没设优先级的线程,执行的是并发的:
线程间不存在synchronized关键字。
线程间存在synchronized关键字:
synchronized关键字主要保证一个线程在执行Synchronized方法或者代码块时,不被另外一个线程所打断。就是要完整的执行,而不是断断续续的。其实synchronized关键字就是运用对象锁的机制。
它可以锁线程之间共同的代码块,也可以锁线程之间不是共同的代码块。用于没设优先级的一些线程。
wait()方法,notify方法和notifyAll()只能用于synchronized关键字当中,用于有锁线程之间的通信。
wait()被调用是,表明当前线程被中止,并且放弃对象锁。
notify()唤醒的是具有锁的线程中的单个线程。
notifyAll()被调用时,唤醒的是具有锁的线程中的多个线程,但是执行的是任意一个。
b.设了优先级,那么优先级高的线程先执行,数字越大,优先级越高。yield表示线程让步,让步给优先级高的线程。
二.wait()方法是释放了对象锁,而sleep(()并没有释放对象锁。
三。java当中,静态方法加上锁,然后在非静态方法加上锁。其实这样它们是无法互斥的。所以需要这么做:
package cn.itcast.heima2;
public class TraditionalThreadSynchronized {
/**
* @param args
*/
public static void main(String[] args) {
new TraditionalThreadSynchronized().init();
}
private void init(){
final Outputer outputer = new Outputer();
new Thread(new Runnable(){
@Override
public void run() {
while(true){
try {
Thread.sleep(10);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
outputer.output("zhangxiaoxiang");
}
}
}).start();
new Thread(new Runnable(){
@Override
public void run() {
while(true){
try {
Thread.sleep(10);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
outputer.output3("lihuoming");
}
}
}).start();
}
static class Outputer{
public void output(String name){
int len = name.length();
synchronized (Outputer.class)
{
for(int i=0;i<len;i++){
System.out.print(name.charAt(i));
}
System.out.println();
}
}
public synchronized void output2(String name){
int len = name.length();
for(int i=0;i<len;i++){
System.out.print(name.charAt(i));
}
System.out.println();
}
public static synchronized void output3(String name){
int len = name.length();
for(int i=0;i<len;i++){
System.out.print(name.charAt(i));
}
System.out.println();
}
}
}
这样,output与output3这两个方法就互斥了。
四.java多线程 典型案例:子线程执行10次,主线程执行100次,两者交替50次,如何实现:
public class Test {
public static void main(String[] args) {
final Business business = new Business();
new Thread(new Runnable() {
public void run() {
for (int i = 1; i <= 50; i++) {
business.sub(i);
}
}
}).start();
for (int i = 1; i <= 50; i++) {
business.main(i);
}
}
}
class Business {
private boolean bShouldSub = true;
public synchronized void sub(int i) {
// 如果bussiness调用sub的话,则【!bShouldSub =false,bShouldSub=true】;
// 然后主线程main为等待,执行完sub后就bShouldSub=false;唤醒主线程main。
while (!bShouldSub) {
try {
this.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
for (int j = 1; j <= 10; j++) {
System.out.println("sub thread sequence of " + j + ",loop of " + i);
}
bShouldSub = false;
// 唤醒main
this.notify();
}
public synchronized void main(int i) {
while (bShouldSub) {
try {
this.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
for (int j = 1; j <= 100; j++) {
System.out
.println("main thread sequence of " + j + ",loop of " + i);
}
bShouldSub = true;
// 唤醒sub
this.notify();
}
}
浙公网安备 33010602011771号