Collecting stats does not lock the table, so activity is fine. Obviously collecting the stats will run some big queries on the table, so ensure you have a reasonable size for undo_retention.
Make sure you collect stats with estimate_percent being dbms_stats.auto_sample_size. When you do this, we can avoid some of the huge sorting operations needed to calculate distinct values for columns.
More details here
https://blogs.oracle.com/optimizer/entry/how_does_auto_sample_size If it still runs too slowly, look at tinkering with the degree parameter.
Longer term you might want to consider
- incremental statistics (check the docs for this)
- manually setting them. On huge tables, most stats can be deduced rather than calculated - eg high water mark for dates is often today, the number of rows added per day is unchanging etc...and dbms_stats.set_table_stats is a lot more efficient than scanning the whole table.
Hope this helps.