多线程
进程与线程的区别:
进程:程序的执行过程,持有资源(内存)(共享内存和文件)和线程。比如,电脑上的eclipse、QQ、微信等运行中的软件就是一个进程
线程应用:1、eclipse编辑代码时,eclipse后台自动会有语法校验、源码编译
2、QQ聊天时同时可以接收文件
3、一个班级是个进程,那么每个学生就是每个线程
总结:1、线程是系统中最小的执行单元
2、同一个进程可以有多个线程
3、线程共享进程资源
![359085bea5f078ef9008354178f8267c.png](https://i-blog.csdnimg.cn/blog_migrate/cbed8e9467cc725fc631344bd3e8848e.jpeg)
当线程执行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线程池
略作了解,面试可能会问有几种方法创建线程,尽量多说,着重说前两个。。。