一:线程与之前所学的进程区别:
进程:系统进行资源分配的最小单位,资源是独立的
线程:CPU调度的最小的单位,线程间共享资源。多线程几个线程共占据一个进程,单线程独占一个线程。

主线程就像是前台接待,当工作量太多时,就指挥子线程去完成对应工作。

二,如何创建线程
继承Thread类和实现Runnable接口。
在使用Runnable接口时需要建立一个Thread实例。因此,无论是通过Thread类还是Runnable接口建立线程,都必须建立Thread类或它的子类的实例。

Thread构造函数:

public Thread( );
public Thread(Runnable target);
public Thread(String name);
public Thread(Runnable target, String name);
public Thread(ThreadGroup group, Runnable target);
public Thread(ThreadGroup group, String name);
public Thread(ThreadGroup group, Runnable target, String name);
public Thread(ThreadGroup group, Runnable target, String name, long stackSize);

第一类:

public class ThreadDemo{ public static void main(String[] args){ Demo d = new Demo();//创建多线程 d.start();//启动线程 for(int i=0;i<60;i++){ System.out.println(Thread.currentThread().getName()+i);//打印当前线程名称 } } } class Demo extends Thread{//继承thread类 public void run(){//run方法相当于线程的行动指南(做什么工作) for(int i=0;i<60;i++){ System.out.println(Thread.currentThread().getName()+i);//打印名字 } } }

第二类:
public class ThreadDemo{
public static void main(String[] args){
Demo d =new Demo();
Thread t = new Thread(d);//Thread类或它的子类的实例。
t.start();
for(int x=0;x<60;x++){
System.out.println(Thread.currentThread().getName()+x);
}
}
}
class Demo implements Runnable{
public void run(){
for(int x=0;x<60;x++){
System.out.println(Thread.currentThread().getName()+x);
}
}
}
三:如何终止线程。

使用退出标志,使线程正常退出,也就是当run方法完成后线程终止。

使用stop方法强行终止线程(这个方法不推荐使用,可能发生不可预料的结果)。

使用interrupt方法中断线程。
举例子:A通知B A.interrupt() A将指示灯置亮,B发生中断,(如果B睡着的话,会存在通知不及时的情况)
B如何查看指示灯状态。Thread.interrupted()和Thread.isinterrupted()

Thread.isinterrupted()会将指示灯复位,置回原来的状态。可查看任意线程的状态。
Thread.interrupted()不会将指示灯复位,只可查看当前线程的状态。

四:多线程安全问题
问题原因:当多条语句在操作同一个线程共享数据时,一个线程对多条语句只执行了一部分,还没执行完,另一个线程参与进来执行,导致共享数据的错误。

解决办法:对多条操作共享数据的语句,只能让一个线程都执行完,在执行过程中,其他线程不执行。

两个关键字:
volatile修饰变量,实现可见性,当线程的工作内存数据改变,主内存也随之改变,
synchronized修饰方法,实现加锁功能,当CPU发生调度时,保证自己的工作不会受别人打扰。
同步代码块:

public class ThreadDemo3 { public static void main(String[] args){ Ticket t =new Ticket(); Thread t1 = new Thread("线程一"); Thread t2 = new Thread("线程二"); Thread t3 = new Thread("线程三"); Thread t4 = new Thread("线程四"); t1.start(); t2.start(); t3.start(); t4.start(); }}class Ticket implements Runnable{ private int ticket =400; public void run(){ while(true){ synchronized (new Object()) { try { Thread.sleep(1); } catch (InterruptedException e) { e.printStackTrace(); } if(ticket<=0) break; System.out.println(Thread.currentThread().getName()+ticket--); } } }}同步函数:public class ThreadDemo3 { public static void main(String[] args){ Ticket t =new Ticket(); Thread t1 = new Thread("线程一"); Thread t2 = new Thread("线程二"); Thread t3 = new Thread("线程三"); Thread t4 = new Thread("线程四");); t1.start(); t2.start(); t3.start(); t4.start(); }}class Ticket implements Runnable{ private int ticket = 4000; public synchronized void saleTicket(){ if(ticket>0) System.out.println(Thread.currentThread().getName()+ticket--); } public void run(){ while(true){ saleTicket(); } }}