ThreadLocal介绍、线程停止的方法

qq_34939750 2019-03-02 04:16:46
1、ThreadLocal的介绍:ThreadLocal是线程的局部变量,是每一个线程所单独特有的,其他线程不能对其进行访问,通常是类中的private static 字段,是对该字段初始值的一个拷贝。用来解决多线程程序的并发问题。通常用来解决数据库的连接,Session管理等问题。
常用的方法有:
public T get() { } // 用来获取ThreadLocal在当前线程中保存的变量副本
public void set(T value) { } //set()用来设置当前线程中变量的副本
public void remove() { } //remove()用来移除当前线程中变量的副本
protected T initialValue() { } //initialValue()是一个protected方法,一般是用来在使用时进行重写的
2、 线程停止的方法:
wait:线程等待、sleep:线程休眠、interrupt:线程终止
线程停止某段时间后,继续运行的方法:
唤醒wait用notify,notifyAll方法
sleep():休眠的时间单位为毫秒,等到休眠结束后,线程进入就绪状态和其他线程一起抢占cup的执行时间。
interrupt终止线程时,如果线程处在可中断状态下,当调用了wait,sleep等可以阻塞线程的方法后,线程会立即被唤醒,同时会收到一个InterruptException,
如果线程处在不可中断状态下,就是没有调用sleep或者wait等方法,那么java只是设置一下该线程的interrupt状态,线程会照常运行,如果该线程之后会调用行数阻塞API,那到时候线程会马会上跳出,并抛出InterruptedException,接下来的事情就跟第一种状况一致了。如果不会调用阻塞API,那么这个线程就会一直执行下去。
定时器的实现:
1. import java.util.Calendar;
2. import java.util.Date;
3. import java.util.Timer;
4.
5. /**
6. * 任务管理
7. * @author admin_Hzw
8. *
9. */
10. public class TimerManager {
11.
12. /**
13. * @param args
14. */
15. public static void main(String[] args) {
16. new TimerManager();
17. }
18.
19. //时间间隔(一天)
20. private static final long PERIOD_DAY = 24 * 60 * 60 * 1000;
21. public TimerManager() {
22. Calendar calendar = Calendar.getInstance();
23. calendar.set(Calendar.HOUR_OF_DAY, 1); //凌晨1点
24. calendar.set(Calendar.MINUTE, 0);
25. calendar.set(Calendar.SECOND, 0);
26. Date date=calendar.getTime(); //第一次执行定时任务的时间
27. //如果第一次执行定时任务的时间 小于当前的时间
28. //此时要在 第一次执行定时任务的时间加一天,以便此任务在下个时间点执行。如果不加一天,任务会立即执行。
29. if (date.before(new Date())) {
30. date = this.addDay(date, 1);
31. }
32. Timer timer = new Timer();
33. Task task = new Task();
34. //安排指定的任务在指定的时间开始进行重复的固定延迟执行。
35. timer.schedule(task,date,PERIOD_DAY);
36. }
37. // 增加或减少天数
38. public Date addDay(Date date, int num) {
39. Calendar startDT = Calendar.getInstance();
40. startDT.setTime(date);
41. startDT.add(Calendar.DAY_OF_MONTH, num);
42. return startDT.getTime();
43. }
44. }
3、 1)使用java程序将字符串输出到本子文件中,属于写的操作,可以使用字节流或者字符流,使用字节流的话需要创建OutputStream对象,以及File对象,通过创建File对象指定文件的路径和名称。并通过write()方法,将字符串输出到指定文件中。如果使用字符流,需要创建Write对象,可以使用带缓冲区的Writer加快数据写的效率(BufferedWriter),并使用write()方法将数据写入到指定的文件中。
2)在使用输出流向文件中写数据时,即使文件不存在,也会自动创建文件,并将数据写入到指定的文件中。如果文件名重复,则会出现内容的覆盖,如果在创建输出流时,指定append参数为true,可以向文件中追加字符串。如果要避免文件名一样的情况,可以使用系统的当前时间加上1000以内的随机数来决定文件的名称,这样文件名就不会冲突了。
4、可以使用反射的机制,通过clazz.getMethod()方法动态的获取执行的方法,获取到方法后,通过invoke(),动态的向方法中赋值
...全文
111 回复 打赏 收藏 转发到动态 举报
写回复
用AI写文章
回复
切换为时间正序
请发表友善的回复…
发表回复

23,404

社区成员

发帖
与我相关
我的任务
社区描述
Java 非技术区
社区管理员
  • 非技术区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧