一:线程与之前所学的进程区别:
进程:系统进行资源分配的最小单位,资源是独立的
线程: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();
}
}
}
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。