扫二维码与项目经理沟通
我们在微信上24小时期待你的声音
解答本文疑问/技术咨询/运营咨询/技术建议/互联网交流
一:线程与之前所学的进程区别:
进程:系统进行资源分配的最小单位,资源是独立的
线程: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();
}
}
}
我们在微信上24小时期待你的声音
解答本文疑问/技术咨询/运营咨询/技术建议/互联网交流