powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / потоки
5 сообщений из 5, страница 1 из 1
потоки
    #37718934
spbsmile
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Привет!

задачка : есть 2 потока
1. слово "Petr" записывается через каждые 5 секунд
2. слово "Alex" записывается через каждые 3 секунды.
и все это одновременно записывается в один файл.
и файл можно просматривать в интерактивном режиме.

для начала я решил написать с одним потоком, с 1.
моя логика: возьму пример из хострсмана , описывающий метод callback, который выводит через каждый определенный момент времени текущее время и просто эту программу переделаю, вместо время буду делать операцию запись в файл.
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
import java.awt.*;
import java.awt.event.*;
import java.io.*;
import java.util.*;
import javax.swing.*;
import javax.swing.Timer;
 
 
public class InnerClassTest {
    public static void main(String[] args){
 
     TalkingClock clock = new TalkingClock(1000, true );
         clock.start();
         
         JOptionPane.showMessageDialog(null, "Quit progamm?");
         System.exit(0);
    }    
}
 
class TalkingClock {
    public TalkingClock( int interval, boolean beep) {
             this.interval = interval;
             this.beep = beep;
        }
    
        public void start() {
            ActionListener listener = new TimerPrinter();
            Timer t = new Timer(interval, listener);
             t.start();
        }
    
    private int interval;
    private boolean beep;       
 
    private class TimerPrinter implements ActionListener {
            public void actionPerformed(ActionEvent event){
                    String name = "Petr";
                    byte buff[] = name.getBytes();
                    try
                    {
                        File file = new File("Currenr.txt");
                        if (!file.exists())
                        {
                                file.createNewFile();
                        }
                        
                        FileOutputStream out = new FileOutputStream("Currenr.txt");
                        for ( int i=0; i<buff.length; i++)
                        {
                                out.write(buff[i]);
                        }
                        
                        out.close();
                    }
                    
                    catch(FileNotFoundException e)
                    {}
                    
                    catch(IOException e)
                    {}
                /*
                    Date now = new Date(); 
                    System.out.println("At the tone, the time is " + now);
                    */if (beep) Toolkit.getDefaultToolkit().beep(); 
                        }
                        
    }
}


почему происходит запись в файл только один раз?
и на правильном ли я пути?
Спасибо!
...
Рейтинг: 0 / 0
потоки
    #37719056
OOsalivan
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
spbsmile,

Какая связь между исходной задачей и свингом, где поток (имплементирующий ранобл колбл) ?
...
Рейтинг: 0 / 0
потоки
    #37719669
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Swing Timer работает в Event Dispatch Thread. Ваш Action всегда выполняется в одном потоке.
У вас очень много лишних операций именно в методе который предполагает быть конкурентным - проверить файл, создать, записать, закрыть. Хотя открытие и закрытие это общие операции. Конкрентная только запись.
Никогда не оставляйте пустых catch блоков. Вы просто не узнаете об ошибках.
Закрывать IO потоки нужно в блоке finally, либо использовать синтаксиси из Java 7: http://www.baptiste-wicht.com/2010/08/java-7-try-with-resources-statement/
File*Stream очень желательно оборачивать в Buffered*Stream, иначе запись и чтение будут на много медленнее.
...
Рейтинг: 0 / 0
потоки
    #37719718
SkyNIN
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Если 2 потока, то и делать нужно 2

причем, если через каждые x секунд - то это не поток свинга.

Итого будет 4 потока, чтобы не заморачиваться
1. свинговый где находятся слушатели, контролы и проч
2. поток который кладет в очередь каждые x секунд нечто
3. поток который кладет в очередь каждые y секунд нечто
4. поток который каждые z секунд смотрит в очередь, и в порядке поступления из нее выбирает данные, пока там что-то есть, и пишет в файл. z может быть как наименьшим из x и y, так и произвольным.

Чтобы управлять потоками, они должны поддерживать какие-то команды, которые будут поступать из свинга.

Мыслите о потоках как об отдельных субъектах, клерках в бюрократической конторе, рабочих на конвейере - каждый занят своей работой, ему приходит задание или команда, он ее выполняет. Тот кто дал ему задание - не ждет выполнения, а занимается своими делами. Или ждет когда ему дадут задание, или команду - все на обед!
...
Рейтинг: 0 / 0
потоки
    #37721135
пролетевший
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SkyNIN,

Не надо ничего по таймеру проверять. Все потоки которые передают информацию, кладут их в BlockingQueue ( см javax.nio для подходящей реализации ). Поток который пишет в фаил читает в цикле из очереди и записывает. Если в очереди нет данных, он просто перейдет в режим ожидания.
Ну и естественно все ошибочные ситуации обрабатывать...
...
Рейтинг: 0 / 0
5 сообщений из 5, страница 1 из 1
Форумы / Java [игнор отключен] [закрыт для гостей] / потоки
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]