不得不说,线程一直是我的软肋~~
所以捏~~发现了缺点就应该及时地补救(蔡依林的看我72变 ->再努力一点,把缺点变成优点)
好了类,不多说,进入正题。
1.什么是线程?
线程还被称为轻量级的进程,线程是程序执行流中的最小单元。那为什么 会有多线程这样的东东呢,试想啊,如果这从网上下载一首歌(假设启动了线程A),这个时候你还要和MM聊QQ(这时候 假设启动了线程B),如果没有多线程的存在,你的交互就会变成,要么先下完歌再聊天,要么聊了天后再下歌,亲还能得了不?呵呵。所以啊,这个多线程就是解决这样问题的东东咯。每个线程会轮询地换得时间片段执行(当然根据CPU的不同算法不一样咯),这样就让你一边聊天一边下歌咯!
2.线程有哪些状态
3.JAVA实现线程的方式
实现Runnable或者是继承Thread(实际上Thread就是实现了Runnable )
4.经典例子讲解(传说中的生产者消费者问题):
package com.mythread;
public class ProductExample {
private int productCount = 0;
/**
* 生产产品
*/
public synchronized void create() {
productCount++;
// 通知一个消费者,生产好了,注意是通知一个哦~~如果你用notifyAll把所有的都叫醒了,可就糟糕了!可以自己试试!
notify();
System.out.println("product count :" + productCount);
}
/**
* 消费产品
*
* @throws InterruptedException
*/
public synchronized void get(int i) throws InterruptedException {
if(productCount <= 0) {
// 如果当前没有产品,则等着生产者唤醒
wait();
}
productCount--;
System.out.println("product count :" + productCount
+ " get by customer" + i);
}
/**
* 生产者
*/
static class Creator extends Thread {
private ProductExample pro;
public Creator(ProductExample pro) {
super();
this.pro = pro;
}
@Override
public void run() {
pro.create();
}
}
/**
* 消费者
*/
static class Customer extends Thread {
private ProductExample pro;
private int id;
public Customer(ProductExample pro, int id) {
super();
this.pro = pro;
this.id = id;
}
@Override
public void run() {
try {
System.out.println("Customer " + id + " start!");
pro.get(id);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
public static void main(String[] args) {
ProductExample resource = new ProductExample();
for (int i = 0; i < 200; i++) {
Customer custormer = new Customer(resource, i);
custormer.start();
}
for (int i = 0; i < 3; i++) {
Creator creator = new Creator(resource);
creator.start();
}
}
}