适用于这个线程代码只在某个地方使用一次:
图二17-18可以简化成:
new Thread(r,"匿名内部类线程").start();
适用于这个线程代码只在某个地方使用一次:
图二17-18可以简化成:
new Thread(r,"匿名内部类线程").start();
当我们调用ti.start(0方法的时候,ti会调用t里面的run方法。所以就需要把t传递给t1.
1.线程的休眠设置:
在哪个方法调用休眠就让该方法休眠指定时间(毫秒)
2.线程的加入:
因为t1是属于子线程在main方法调用,当调用完之后,因为在main方法加入:t1.join();,所以t1就会变成当前线程。
t1.join();//当t1加入到当前线程中,就是加入到主线程中,就是放在主线程中去继续执行。
守护线程:因为t2是守护线程,当t1运行完之后,系统需要反应时间,当t2运行到47的时候,系统检测到系统运行中只有守护线程t2,就会把t2杀死掉。
先让t1运行,接着Thread线程进行sleep状态,时间为一毫秒,最后把t1进行stop。
中断线程stop和interrupted的区别:
前者是直接中断,没有任何提示,导致无法释放占用资源;后者是会给予提示(boolean类型),这样就可以释放资源,再中断。
要想启动多个线程,不可以重复使用start,除非创建多个对象。04:03
第二种改名方式:
Thread.currentThread()可以获取当前方法的主线程,也可以获取zhu线程。
线程调度:分时调度、抢占式调度(按照优先级)
要有线程对象,通过该对象才可以获取优先级。
下面是获取子线程的优先级;
MyThread thread=new MyThread();
System.out.println(thread.getPriority());
cpu给每个线程分配时间片,去执行每个线程中的代码,进而看起来每个进程都在进行着。(例子:厨师同一时间煮duo men cai)
当我们调用start,系统会自动调用run方法。(因为MyThread是继承自Thread)。
这个时候,我们只是单独调用run方法,调用完之后才运行for循环,没有体现多线程同时运行。
为什么创建线程类需要使用继承方法?
因为线程类thread只有run方法,这个run方法并没有做什么事,所以我们需要通过继承来对这个方法进行重写。
一个程序就是一个进程,计算机是支持多进程的。
breakpoint断点
debug排除错误
当我们遇到一个方法的时候,step into会进去这个方法去执行;step over就是跳过这个方法,把这个方法执行完。
单线程无法同时进行两个方法,多线程可以同时进行多个方法。
5.14 4.3
5.13 4.29
Thread.sleep();//线程休眠
守护线程
输出流:
第一步创建socket对象,指定IP地址和端口号
第二部创建输出流对象,用socket对象获取输出流
第三步 用输出流对象的write方法写入输出流内容
第四步关闭输出流
线程的休眠
Thread.sleep(2000); 单位是毫秒
线程的加入
(线程的对象名).join(); 当这个线程执行完后在执行下面的线程而不用抢CUP处理
守护线程
(线程的对象名).setDaemon(true);
需要在被守护的线程前调用
终止线程
(线程的对象名).stop ()
中断线程
(线程的对象名).interrupt()
一个类同时执行两个线程可以新建两个对象 分别来调用start()方法
列如:
Student s1 = new Studnet();
s1.start();
Student s2 = new Studnet();
s2.start();
获取线程的名字使用 (对象名).getName();
设置线程的名字可以使用(对象名).setName();
也可以通过对象的构造方法来改变线程的名字
列如:
Student st = new Student("线程1");
(继承了线程的对象).getPriority(); 获取优先级
Thread.currentThread(); 获取当前线程的主线程
(继承了线程的对象).setPriority; 设置优先级
优先级的范围在1-10之间
一个进程就是一个程序