实现runnable接口创建线程_多线程:面试常问的两种创建方式,数据共享实现和正确停止线程...

多线程

进程与线程的区别

进程:程序的执行过程,持有资源(内存)(共享内存和文件)和线程。比如,电脑上的eclipse、QQ、微信等运行中的软件就是一个进程

线程应用:1、eclipse编辑代码时,eclipse后台自动会有语法校验、源码编译

2、QQ聊天时同时可以接收文件

3、一个班级是个进程,那么每个学生就是每个线程

总结:1、线程是系统中最小的执行单元

2、同一个进程可以有多个线程

3、线程共享进程资源

359085bea5f078ef9008354178f8267c.png

当线程执行wait()时,会把当前的锁释放,然后让出CPU,进入等待状态。

当执行notify/notifyAll方法时,会唤醒一个处于等待该对象锁的线程

线程的两种常用创建方法

public class T1 extends Thread

{

@Override

public void run()

{

}

}

class T2 implements Runnable{

@Override

public void run()

{

}

}

线程setName和启动

Thread t1=new T1();

t1.setName("t1");

t1.start();

Thread t2=new Thread(new T2(),"t2");

t2.start();

两种创建创建线程的区别

1.Thread类实现了Runnable接口,继承Thread类就是实现了Runnable接口

2.使用实现Runnable接口的方式创建线程,克服了单继承的缺点

我觉得区别不大,在写代码时,如果这个类需要扩展性你就用实现Runnable接口这种方法,如果这个类不需要扩展性你就要继承Thread类的方法

如何实现数据共享:

public class T1 extends Thread

{

private static int ticket=10;//共享的数据只有一份

@Override

public void run()

{

synchronized (this)//必须加

{

for (int i = 0; i < 10; i++)

{

if (ticket>0)

{

System.out.println(Thread.currentThread().getName() + "卖票" + (ticket--));

}

我看了网上好多说实现Runnable接口更容易实现数据共享,我认为不对,很多网上的帖子需要自己实践才知道对不对,关于数据共享我总结就两个关键点,拿上面那个简单卖票案例说。

1.关键的临界数据,也就是共享数据ticket,加static关键字

2.run()方法中加synchronized关键字

只要处理好这两点就不会出现,本来10张票,n个线程卖了n*10张票

如何停止线程

1.设置退出标志/开关

2.stop()是一种错误的线程退出方法,会显得程序戛然而止

3.itThread.interrupt();并不是正确的退出方法

总结:正确的线程停止方法就一种设置退出标识

Thread.Interrupt方法只是设置相关线程的中断标志位,通知目标线程中断,即该方法只是修改标志位并没有对真正中断该线程。所以需要在目标类中手动添加中断处理逻辑,在发现了中断信号执行相关逻辑。所以,搞来搞去正确的线程停止方法还是要设置退出标识。

java四种创建的方式:1.Thread 2.Runnable 3.Callable和Future 4.ExecutorService线程池

略作了解,面试可能会问有几种方法创建线程,尽量多说,着重说前两个。。。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值