以前没有写笔记的习惯,现在慢慢的发现及时总结是多么的重要了,呵呵。虽然才大二,但是也快要毕业了,要加油了。 
这一篇文章主要关于java多线程,主要还是以例子来驱动的。因为讲解多线程的书籍和文章已经很多了,所以我也不好意思多说,呵呵、大家可以去参考一些那些书籍。我这个文章主要关于实际的一些问题。同时也算是我以后复习的资料吧,。呵呵大家多多指教。 
同时希望多结交一些技术上的朋友。谢谢。 
---------------------------------------------------------------------------------------------------------------------------------------------------- 
java中的多线程 
在java中要想实现多线程,有两种手段,一种是继续Thread类,另外一种是实现Runable接口。 
对于直接继承Thread的类来说,代码大致框架是: 
}
public hello() {
}
public hello(String name) { 
this.name = name; 
} 
public void run() { 
for (int i = 0; i < 5; i++) { 
System.out.println(name + "运行 " + i); 
} 
} 
public static void main(String[] args) { 
hello h1=new hello("A"); 
hello h2=new hello("B"); 
h1.run(); 
h2.run(); 
} 
private String name; 
}
}
public hello() {
}
public hello(String name) { 
this.name = name; 
} 
public void run() { 
for (int i = 0; i < 5; i++) { 
System.out.println(name + "运行 " + i); 
} 
} 
public static void main(String[] args) { 
hello h1=new hello("线程A"); 
Thread demo= new Thread(h1); 
hello h2=new hello("线程B"); 
Thread demo1=new Thread(h2); 
demo.start(); 
demo1.start(); 
} 
private String name; 
}
关于选择继承Thread还是实现Runnable接口? 
其实Thread也是实现Runnable接口的: 
public static void main(String[] args) { 
hello h1 = new hello(); 
hello h2 = new hello(); 
hello h3 = new hello(); 
h1.start(); 
h2.start(); 
h3.start(); 
} 
private int count = 5; 
}
public static void main(String[] args) { 
hello he=new hello(); 
new Thread(he).start(); 
} 
private int count = 5; 
}
总结一下吧: 
实现Runnable接口比继承Thread类所具有的优势: 
1):适合多个相同的程序代码的线程去处理同一个资源 
2):可以避免java中的单继承的限制 
3):增加程序的健壮性,代码可以被多个线程共享,代码和数据独立。 
所以,本人建议大家劲量实现接口。 
public static void main(String[] args) { 
hello he = new hello(); 
new Thread(he,"A").start(); 
new Thread(he,"B").start(); 
new Thread(he).start(); 
} 
}
在java中,每次程序运行至少启动2个线程。一个是main线程,一个是垃圾收集线程。因为每当使用java命令执行一个类的时候,实际上都会启动一个JVM,每一个jVM实习在就是在操作系统中启动了一个进程。 
判断线程是否启动 
public static void main(String[] args) { 
hello he = new hello(); 
Thread demo = new Thread(he); 
System.out.println("线程启动之前---》" + demo.isAlive()); 
demo.start(); 
System.out.println("线程启动之后---》" + demo.isAlive()); 
} 
}  
线程的强制执行: 
public static void main(String[] args) { 
hello he = new hello(); 
Thread demo = new Thread(he,"线程"); 
demo.start(); 
for(int i=0;i<50;++i){ 
if(i>10){ 
try{ 
demo.join(); //强制执行demo 
}catch (Exception e) { 
e.printStackTrace(); 
} 
} 
System.out.println("main 线程执行-->"+i); 
} 
} 
}
线程的休眠: 
public static void main(String[] args) { 
hello he = new hello(); 
Thread demo = new Thread(he, "线程"); 
demo.start(); 
} 
}
线程的中断: 
public static void main(String[] args) { 
hello he = new hello(); 
Thread demo = new Thread(he, "线程"); 
demo.start(); 
try{ 
Thread.sleep(2000); 
}catch (Exception e) { 
e.printStackTrace(); 
} 
demo.interrupt(); //2s后中断线程 
} 
}
在java程序中,只要前台有一个线程在运行,整个java程序进程不会小时,所以此时可以设置一个后台线程,这样即使java进程小时了,此后台线程依然能够继续运行。 
public static void main(String[] args) { 
hello he = new hello(); 
Thread demo = new Thread(he, "线程"); 
demo.setDaemon(true); 
demo.start(); 
} 
}
public static void main(String[] args) { 
Thread h1=new Thread(new hello(),"A"); 
Thread h2=new Thread(new hello(),"B"); 
Thread h3=new Thread(new hello(),"C"); 
h1.setPriority(8); 
h2.setPriority(2); 
h3.setPriority(6); 
h1.start(); 
h2.start(); 
h3.start(); 
} 
}
另外,主线程的优先级是5. 
线程的礼让。 
在线程操作中,也可以使用yield()方法,将一个线程的操作暂时交给其他线程执行。 
public static void main(String[] args) { 
Thread h1=new Thread(new hello(),"A"); 
Thread h2=new Thread(new hello(),"B"); 
h1.start(); 
h2.start(); 
} 
}
同步和死锁: 
【问题引出】:比如说对于买票系统,有下面的代码: 
public static void main(String[] args) { 
hello he=new hello(); 
Thread h1=new Thread(he); 
Thread h2=new Thread(he); 
Thread h3=new Thread(he); 
h1.start(); 
h2.start(); 
h3.start(); 
} 
private int count=5; 
}
【同步代码块】: 
语法格式: 
synchronized(同步对象){ 
//需要同步的代码 
} 
但是一般都把当前对象this作为同步对象。 
比如对于上面的买票的问题,如下: 
public static void main(String[] args) { 
hello he=new hello(); 
Thread h1=new Thread(he); 
Thread h2=new Thread(he); 
Thread h3=new Thread(he); 
h1.start(); 
h2.start(); 
h3.start(); 
} 
private int count=5; 
}
public synchronized void sale() { 
if (count > 0) { 
try { 
Thread.sleep(1000); 
} catch (InterruptedException e) { 
e.printStackTrace(); 
} 
System.out.println(count--); 
} 
} 
public static void main(String[] args) { 
hello he = new hello(); 
Thread h1 = new Thread(he); 
Thread h2 = new Thread(he); 
Thread h3 = new Thread(he); 
h1.start(); 
h2.start(); 
h3.start(); 
} 
private int count = 5; 
}
public String getName() { 
return name; 
} 
public void setName(String name) { 
this.name = name; 
} 
public int getAge() { 
return age; 
} 
public void setAge(int age) { 
this.age = age; 
} 
private String name = "Rollen"; 
private int age = 20; 
} 
/** 
* 生产者 
* */ 
class Producer implements Runnable{ 
private Info info=null; 
Producer(Info info){ 
this.info=info; 
} 
public void run(){ 
boolean flag=false; 
for(int i=0;i<25;++i){ 
if(flag){ 
this.info.setName("Rollen"); 
try{ 
Thread.sleep(100); 
}catch (Exception e) { 
e.printStackTrace(); 
} 
this.info.setAge(20); 
flag=false; 
}else{ 
this.info.setName("chunGe"); 
try{ 
Thread.sleep(100); 
}catch (Exception e) { 
e.printStackTrace(); 
} 
this.info.setAge(100); 
flag=true; 
} 
} 
} 
} 
/** 
* 消费者类 
* */ 
class Consumer implements Runnable{ 
private Info info=null; 
public Consumer(Info info){ 
this.info=info; 
} 
public void run(){ 
for(int i=0;i<25;++i){ 
try{ 
Thread.sleep(100); 
}catch (Exception e) { 
e.printStackTrace(); 
} 
System.out.println(this.info.getName()+"<---->"+this.info.getAge()); 
} 
} 
} 
/** 
* 测试类 
* */ 
class hello{ 
public static void main(String[] args) { 
Info info=new Info(); 
Producer pro=new Producer(info); 
Consumer con=new Consumer(info); 
new Thread(pro).start(); 
new Thread(con).start(); 
} 
}
那么如何解决呢? 
<!--[if !supportLists]-->1) <!--[endif]-->加入同步 
<!--[if !supportLists]-->2) <!--[endif]-->加入等待和唤醒 
先来看看加入同步会是如何。 
public String getName() { 
return name; 
} 
public void setName(String name) { 
this.name = name; 
} 
public int getAge() { 
return age; 
} 
public void setAge(int age) { 
this.age = age; 
} 
public synchronized void set(String name, int age){ 
this.name=name; 
try{ 
Thread.sleep(100); 
}catch (Exception e) { 
e.printStackTrace(); 
} 
this.age=age; 
} 
public synchronized void get(){ 
try{ 
Thread.sleep(100); 
}catch (Exception e) { 
e.printStackTrace(); 
} 
System.out.println(this.getName()+"<===>"+this.getAge()); 
} 
private String name = "Rollen"; 
private int age = 20; 
} 
/** 
* 生产者 
* */ 
class Producer implements Runnable { 
private Info info = null; 
Producer(Info info) { 
this.info = info; 
} 
public void run() { 
boolean flag = false; 
for (int i = 0; i < 25; ++i) { 
if (flag) { 
this.info.set("Rollen", 20); 
flag = false; 
} else { 
this.info.set("ChunGe", 100); 
flag = true; 
} 
} 
} 
} 
/** 
* 消费者类 
* */ 
class Consumer implements Runnable { 
private Info info = null; 
public Consumer(Info info) { 
this.info = info; 
} 
public void run() { 
for (int i = 0; i < 25; ++i) { 
try { 
Thread.sleep(100); 
} catch (Exception e) { 
e.printStackTrace(); 
} 
this.info.get(); 
} 
} 
} 
/** 
* 测试类 
* */ 
class hello { 
public static void main(String[] args) { 
Info info = new Info(); 
Producer pro = new Producer(info); 
Consumer con = new Consumer(info); 
new Thread(pro).start(); 
new Thread(con).start(); 
} 
}
public String getName() { 
return name; 
} 
public void setName(String name) { 
this.name = name; 
} 
public int getAge() { 
return age; 
} 
public void setAge(int age) { 
this.age = age; 
} 
public synchronized void set(String name, int age){ 
if(!flag){ 
try{ 
super.wait(); 
}catch (Exception e) { 
e.printStackTrace(); 
} 
} 
this.name=name; 
try{ 
Thread.sleep(100); 
}catch (Exception e) { 
e.printStackTrace(); 
} 
this.age=age; 
flag=false; 
super.notify(); 
} 
public synchronized void get(){ 
if(flag){ 
try{ 
super.wait(); 
}catch (Exception e) { 
e.printStackTrace(); 
} 
} 
try{ 
Thread.sleep(100); 
}catch (Exception e) { 
e.printStackTrace(); 
} 
System.out.println(this.getName()+"<===>"+this.getAge()); 
flag=true; 
super.notify(); 
} 
private String name = "Rollen"; 
private int age = 20; 
private boolean flag=false; 
} 
/** 
* 生产者 
* */ 
class Producer implements Runnable { 
private Info info = null; 
Producer(Info info) { 
this.info = info; 
} 
public void run() { 
boolean flag = false; 
for (int i = 0; i < 25; ++i) { 
if (flag) { 
this.info.set("Rollen", 20); 
flag = false; 
} else { 
this.info.set("ChunGe", 100); 
flag = true; 
} 
} 
} 
} 
/** 
* 消费者类 
* */ 
class Consumer implements Runnable { 
private Info info = null; 
public Consumer(Info info) { 
this.info = info; 
} 
public void run() { 
for (int i = 0; i < 25; ++i) { 
try { 
Thread.sleep(100); 
} catch (Exception e) { 
e.printStackTrace(); 
} 
this.info.get(); 
} 
} 
} 
/** 
* 测试类 
* */ 
class hello { 
public static void main(String[] args) { 
Info info = new Info(); 
Producer pro = new Producer(info); 
Consumer con = new Consumer(info); 
new Thread(pro).start(); 
new Thread(con).start(); 
} 
}
新闻热点
疑难解答